【问题标题】:Syntax to import an operator from a module in python从python中的模块导入运算符的语法
【发布时间】: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

这让我决定要隐式导入运算符,即在没有命名空间的情况下调用 &gt;&gt;,但在 p 命名空间内导入非运算符。

编辑更新

说清楚,我的问题是:

如何将 many1() 之类的函数导入命名空间为 p.many1(),并导入运算符函数,如“+”“>>”“

结束更新

虽然我能做到

import parsec as p

要获得非运算符功能,我不清楚该怎么说:

from parsec import &gt;&gt;

因为以下显式导入运算符的尝试都失败了:

>>> 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 &gt;&gt; p.many()&gt;&gt; 实际上是在调用一个函数p.__rshift__。所以你应该把它叫做p.__rshift__(p.many())
  • 谢谢你,@Sraw。你能解释一下你想看到的例子吗?我提供了我尝试不工作的 4 个导入的最小示例,以及我希望看到的工作的描述。也许我误解了你的评论,但如果我能提供更多,我就没有问题要问了。
  • @Sraw,我添加了更新中缀。
  • 我...我真的很困惑。您要导入的东西甚至不存在于模块中。我不是 Haskell 方面的专家。我主要使用 Scala 作为 FP 语言。但是如果你看一下源代码。您将看到您需要使用像compose 这样的原始函数,或者构造一个支持您想要的运算符的Parsergithub.com/sighingnow/parsec.py/blob/…

标签: python operator-overloading operators python-import


【解决方案1】:

我认为运算符被定义为解析器对象上的方法,因此您不会显式地将它们作为运算符导入。如果您使用 p 命名空间导入其他对象,并对它们执行运算符操作,它将“正常工作”,因为 Parser 类已经定义了这些。

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2017-10-31
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多