首页 > 解决方案 > 从python中的模块导入运算符的语法

问题描述

我正在使用这个库,它(非常合理,因为它是从另一种语言的习语翻译而来的)大量使用了运算符重定义。

使用from parsec import *通常从它开始,我尽量避免,而是保留我的命名空间。更像是import parsec as p明确地使用子函数和每个运算符。

这适用于某些功能,例如p.many1()orp.spaces()p.regex()

但是,这也让我尝试导入名称空间运算符,这看起来更不符合 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' ()

我怎样才能导入这些?

标签: pythonoperator-overloadingoperatorspython-import

解决方案


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


推荐阅读