【发布时间】:2019-12-20 14:41:42
【问题描述】:
我正在使用this library,它(非常合理,因为它是从另一种语言的习语翻译而来的)大量使用了运算符重定义。
使用以from parsec import * 开头,一般来说,我尽量避免,而是保留我的命名空间。更像import parsec as p 然后明确地使用子函数和每个运算符。
这适用于某些函数,例如 p.many1() 或 p.spaces() 或 p.regex()。
但是,这也让我尝试导入名称空间运算符,这看起来更不像 Python。
例如,按位 >> 和 << 被重新定义。 Here is a real-world usage.
不仅尝试使用命名空间来调用这些运算符看起来也很不合 Python,我什至不清楚该怎么做:p.>>?如您所见,这是一个语法错误:
>>> import parsec as p
>>> p.>> p.many()
File "<stdin>", line 1
p.>>
^
SyntaxError: invalid syntax
这让我决定要隐式导入运算符,即在没有命名空间的情况下调用 >>,但在 p 命名空间内导入非运算符。
编辑更新
说清楚,我的问题是:
如何将 many1() 之类的函数导入命名空间为 p.many1(),并导入运算符函数,如“+”“>>”“
结束更新
虽然我能做到
import parsec as p
要获得非运算符功能,我不清楚该怎么说:
from parsec import >>
因为以下显式导入运算符的尝试都失败了:
>>> from parsec import >>
File "<stdin>", line 1
from parsec import >>
^
SyntaxError: invalid syntax
>>> from parsec import (>>)
File "<stdin>", line 1
from parsec import (>>)
^
SyntaxError: invalid syntax
>>> from parsec import ">>"
File "<stdin>", line 1
from parsec import ">>"
^
SyntaxError: invalid syntax
>>> from parsec import __lshift__, __rshift__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name '__lshift__' from 'parsec' ()
如何导入这些?
【问题讨论】:
-
重新定义的操作符不能从模块中导入。它们被实现为左侧操作数类的特殊方法,有时会回退到右侧操作数类。
-
您能提供一个最小的可执行示例吗?顺便说一句,为什么不
p >> p.many()?>>实际上是在调用一个函数p.__rshift__。所以你应该把它叫做p.__rshift__(p.many()) -
谢谢你,@Sraw。你能解释一下你想看到的例子吗?我提供了我尝试不工作的 4 个导入的最小示例,以及我希望看到的工作的描述。也许我误解了你的评论,但如果我能提供更多,我就没有问题要问了。
-
@Sraw,我添加了更新中缀。
-
我...我真的很困惑。您要导入的东西甚至不存在于模块中。我不是 Haskell 方面的专家。我主要使用 Scala 作为 FP 语言。但是如果你看一下源代码。您将看到您需要使用像
compose这样的原始函数,或者构造一个支持您想要的运算符的Parser:github.com/sighingnow/parsec.py/blob/…
标签: python operator-overloading operators python-import