python - 从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' ()
我怎样才能导入这些?
解决方案
我认为运算符被定义为解析器对象上的方法,因此您不会显式地将它们作为运算符导入。如果您使用 ap 命名空间导入其他对象,并对它们执行运算符操作,它将“正常工作”,因为 Parser 类已定义这些对象。
推荐阅读
- julia - N 长元组作为可选参数
- github - 将文件复制到 GitHub 工作区
- ios - 从情节提要初始化 UIViewController 返回基本 UIViewController 而不是继承的版本
- sql - 如何为 400 万条记录生成 6 位唯一字母数字字符串,长度为 6 个字符,不区分大小写。通过更换
- typescript - 从 Firebase 函数返回更新方法是否会满足承诺要求并自动记录事件?
- firebase - 为什么我的 Flutter 应用程序显示“名称为 __FIRAPP_DEFAULT 的应用程序不存在”。
- django-rest-framework - 使用 Django Rest 框架过滤每个继承视图集的视图集
- javascript - 如何单击 div 并获取其背景颜色(纯 JS)
- c++ - 使用命名空间作为参数的模板函数?
- amazon-web-services - 当我将多个 cloudwatch 日志组流式传输到一个 lambda 时,如何增加策略限制?