我编写了一个方法buildRegex
,给定名称(类型为str
),该方法返回一个在模块regex
中查找from ... import ... name
语句的对象Python
。
例如,这是预期的行为buildRegex
:
>>> regObj = buildRegex('foo')
>>> regObj.search('from a import fool') is None
True
>>> regObj.search('from a import foo') is not None
True
>>> regObj.search('from a.b.c import foo as food') is None
True
>>> regObj.search('from a.b.c import fool, bar as foo') is not None
True
到目前为止,我的工作适用于以上所有示例(以及更多示例):
def buildRegex(name):
singleImportedName = r'(\b{0}\b(?!\s+as\s+))'.format(name)
importStatement = r'from\s+(\w+(\.\w+)*)\s+import\s+([^#\n]*)(?={0})'.format(singleImportedName )
return re.compile(importStatement)
buildRegex
假定搜索的模块没有SyntaxError
,这是可以的。
我的问题是,在查找导入的名称时foo
,我还需要知道它是否是其他名称的别名。即模块是否具有以下语句:
from a.b.c import bar as foo
我想知道什么foo
是混叠,在这种情况下就是bar
。当前,由于asserted lookaheads
正则表达式,这是不可能的。所以,最后我的问题:我如何重构,使该信息不丢失,正则表达式,即,如果给定的名称是别名,则名称的别名是在一个regex
的群体?
import inspect
import importlib
import ast
class Imports(ast.NodeVisitor):
def visit_Import(self, node):
print("In Import")
for imp in node.names:
if imp.asname is not None:
print("module name = {}, alias = {}".format(imp.name, imp.asname))
else:
print("module name = {}".format(imp.name))
print()
def visit_ImportFrom(self, node):
print("In ImportFrom")
for imp in node.names:
if imp.asname is not None:
print("module = {}\nname = {}\nalias = {}\nlevel = {}\n".
format(node.module, imp.name, imp.asname, node.level))
else:
print("module = {}\nname = {}\nlevel = {}\n".
format(node.module, imp.name, node.level))
print()
mod = "temp_test"
mod = importlib.import_module(mod)
p = ast.parse(inspect.getsource(mod))
Imports().visit(p)
输入:
from bisect import bisect_left as bs
import datetime
import time
import numpy as np
def foo():
from re import findall
class Foo():
def test(self):
from re import compile as cp, finditer as ft
输出:
In ImportFrom
module = bisect
name = bisect_left
alias = bs
level = 0
In Import
module name = datetime
In Import
module name = time
In Import
module name = numpy, alias = np
In ImportFrom
module = re
name = findall
level = 0
In ImportFrom
module = re
name = compile
alias = cp
level = 0
module = re
name = finditer
alias = ft
level = 0
类Import(名称)
导入声明。名称是别名节点的列表。
ImportFrom类(模块,名称,级别)
从x导入y表示。module是“
from”名称的原始字符串,没有任何前导点,对于诸如from的语句则为None。导入foo。level是一个保持相对导入级别的整数(0表示绝对导入)。
该greentreesnakes至少文档,我有什么样的所有节点做一个更好的解释,以及如何使用AST模块比实际AST文档本身。
您还可以使用直接传递模块或打开py文件并将内容传递给ast.parse:
with open("temp_test.py") as f:
p = ast.parse(f.read(), filename="<ast>", mode="exec")
Imports().visit(p)
并传递模块:
import temp_test
p = ast.parse(inspect.getsource(temp_test))
Imports().visit(p)
我在我的应用程序中使用EJB3.1。 我想在我的应用程序中将一个EJB的JNDI查找名称发送到另一个应用程序,以便它可以在运行时使用它 用程序找出任意EJB的查找名的过程是什么?
问题内容: 我正在编写一个小脚本,该脚本从目录获取文件名,并将其传递给另一个模块,然后该模块导入文件。 因此流程类似于1)获取模块名称(将其存储在变量中)2)将此变量名称传递给模块3)导入名称存储在变量名称中的模块 我的代码就像 问题在于,当它到达import语句时,它将modulename读取为真实的模块名称,而不是存储在此变量中的值。我不确定这在python中如何工作,解决这个问题的任何帮助都
问题内容: 在PyCharm中,我添加了Python环境。然而, 失败作为未定义的引用。但是,它在命令行的Python解释器中运行良好。 GNURadio可以在Pycharm外部使用python正常工作。一切都已安装并配置为我想要的方式。 格努拉迪奥位于 也: PYTHONPATH = / usr / local / lib / python2.7 / site-packages:/usr/loc
我在让sikuli python单元测试工作时遇到了麻烦,希望能得到一些帮助。我在网上到处搜索,但是没有任何有用的东西。我的python知识非常有限,我想这没有什么帮助... 我用的是win7 32,sikuli 1.0 rc3 (r905),python 2.7.3 我正在尝试通过python运行sikuli单元测试(不使用命令行,只是作为一个python脚本来运行python gui)。除了别
主要内容:导入模块方式一:临时添加模块完整路径,导入模块方式二:将模块保存到指定位置,导入模块方式三:设置环境变量很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误: ModuleNotFoundError: No module named '模块名' 意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找
如果我有的话 在< code>b.py中,我可以< code >导入a 但如果我有 在<code>c中。pydo,突然出现在我得到 怎么了?我看不出第二种情况与第一种情况有什么不同 因此...在最初启动的模块的目录中搜索模块。我只是不明白其中的道理。 我不是在问如何解决问题。而是首先问为什么会有问题...... (在Python 3.8.8上测试)