【问题标题】:get line number which variable is defined in a different file获取在不同文件中定义的变量的行号
【发布时间】:2012-10-25 03:26:42
【问题描述】:

我是否可以获取在不同文件中定义变量的行号。 例如:

file1.py
x = 5
mylist = [ 1, 2, 3]


file2.py

execfile("file1.py")
# TODO
# get line number of 'x' or 'mylist'

我假设每个变量只定义一次,但以防万一他们定义多次怎么办?

谢谢

【问题讨论】:

  • 如果它们被定义多次,那么最后一个定义仍然存在。所以问题是你需要这个做什么?
  • 'file1.py' 正在使用 excefile() 命令导入到 'file2.py' (刚刚编辑了我的问题)。我想知道定义了哪个文件 x(或 mylist)。

标签: python python-2.3


【解决方案1】:

使用regex:

尝试这样的事情,它会返回找到x = something的所有行:

In [25]: with open("fil.py") as f:
    print [index for index,line in enumerate(f) if re.findall(r'(x\s+=)',line)]
   ....:     
[0, 2, 3]

其中fil.py 包含:

x = 5
mylist = [ 1, 2, 3]
x = 7
x = 8

【讨论】:

  • 谢谢,但请记住,我不喜欢阅读“file1.py”,因为这是一个使用 excefile() 命令导入到“file2.py”的 python 文件(刚刚编辑我的问题)
  • @user1798187 以及这样做的原因?
  • 我不喜欢阅读“file1.py”,因为它已经可以在“file2.py”中访问。我可以访问它的成员,意思是查看定义了哪些变量及其值。我唯一缺少的是行号。我主要需要行号来提供详细的日志报告。说'x'必须是正数,但它被定义为-1 我想生成日志:“[第5行]'x'无效。必须是正数。找到'-1'”
  • 我认为execfile()import 不是正确的方法,因为它们会将文件转换为字节码,因此您无法从中获取行号。您需要使用open() 读取文件,或者可以使用configparser 之类的解析模块
【解决方案2】:

使用 ast 模块而不是正则表达式的 Ashwini 答案的略微改进版本是:

import ast

class GetAssignments(ast.NodeVisitor):
    def visit_Name(self, node):
        if isinstance(node.ctx, ast.Store):
            print node.id, node.lineno

with open('testing.py') as fin:
    module = ast.parse(fin.read())
    GetAssignments().visit(module)

而且我认为可以在已经编译的对象上使用类似的东西......

【讨论】:

  • 正如我在我的 cmets 中提到的。我想避免阅读“file1.py”,因为它已经可以在“file2.py”中访问。顺便说一句,我使用的是 python 2.3,所以我认为我没有 'with' 和 'ast' 可用
  • @user1798187 这是一个激进的想法——问什么问题,说明所有可用信息......所以这是 1)你只使用 Python 2.3,2)你已经有来自 execfile 的东西(示例来源是...),并且您想要...的结果。
  • @JonClements 嗨,乔恩。我正在尝试修改此代码,但是当我添加一行 return node.lineno 时,它不会返回任何内容。这是怎么回事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多