Class 方法不会 return 任何东西
Class method won't return anything
当我写脚本时,我有一个个人函数的公共库,我通过延迟导入整个东西来使用它。所以我想清理它,而不是导入数千行代码,我可以有一个脚本自动 select 我需要的特定脚本的功能,并将它们复制到一个文件中以供发布。我使用 ast
和 inspect
的组合得到了工作,但现在我想复制在我的模块内部定义全局变量的确切代码行。
例如,如果我在脚本中使用快捷方式 eprint
,它应该抓取该行:eprint = Eprinter(verbose=1).eprint
,它创建了 class 方法的快捷方式。
我正在尝试采用我在此处找到的代码:
class GetAssignments(ast.NodeVisitor):
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
if node.id == 'eprint':
print(node.id, node.lineno)
return node.lineno
code = inspect.getsource(printing)
a = GetAssignments()
b = a.visit(ast.parse(code))
print('b =', b)
这将打印 node.lineno 就好了,但是它 returns None 我不明白为什么。
ast.NodeVisitor 意味着被子类化,这意味着 visit_Name
不能 return 任何东西。但是,自定义函数可以像这样作为中介:
class GetAssignments(ast.NodeVisitor):
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
if node.id == self.expr:
print("Found line number", node.lineno)
self.lineno = node.lineno
def search(self, node, expr):
self.expr = expr
self.visit(node)
return self.lineno
code = inspect.getsource(printing)
lineno = GetAssignments().search(ast.parse(code), 'eprint')
line = code.split('\n')[lineno-1]
print(lineno, line)
当我写脚本时,我有一个个人函数的公共库,我通过延迟导入整个东西来使用它。所以我想清理它,而不是导入数千行代码,我可以有一个脚本自动 select 我需要的特定脚本的功能,并将它们复制到一个文件中以供发布。我使用 ast
和 inspect
的组合得到了工作,但现在我想复制在我的模块内部定义全局变量的确切代码行。
例如,如果我在脚本中使用快捷方式 eprint
,它应该抓取该行:eprint = Eprinter(verbose=1).eprint
,它创建了 class 方法的快捷方式。
我正在尝试采用我在此处找到的代码:
class GetAssignments(ast.NodeVisitor):
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
if node.id == 'eprint':
print(node.id, node.lineno)
return node.lineno
code = inspect.getsource(printing)
a = GetAssignments()
b = a.visit(ast.parse(code))
print('b =', b)
这将打印 node.lineno 就好了,但是它 returns None 我不明白为什么。
ast.NodeVisitor 意味着被子类化,这意味着 visit_Name
不能 return 任何东西。但是,自定义函数可以像这样作为中介:
class GetAssignments(ast.NodeVisitor):
def visit_Name(self, node):
if isinstance(node.ctx, ast.Store):
if node.id == self.expr:
print("Found line number", node.lineno)
self.lineno = node.lineno
def search(self, node, expr):
self.expr = expr
self.visit(node)
return self.lineno
code = inspect.getsource(printing)
lineno = GetAssignments().search(ast.parse(code), 'eprint')
line = code.split('\n')[lineno-1]
print(lineno, line)