【问题标题】:Determine the source module of a variable in Python without running the code在不运行代码的情况下确定Python中变量的源模块
【发布时间】:2022-12-03 06:38:47
【问题描述】:

是否可以在不运行代码的情况下确定Python中变量的源模块?

我的 Python 代码中有一个变量,我想知道它来自哪个模块。但是,我不想运行代码来找出答案。有没有办法静态分析代码并确定变量的来源模块?

我试过使用pylint 和pyflakes 之类的工具,但它们似乎没有提供这些信息。有没有办法做到这一点,或者如果不运行代码就不可能?我觉得是可以的,因为好像VSCode Python IntelliSense可以通过静态分析的方式判断出不同变量的类型和信息。不幸的是,我不确定 IntelliSense 是如何工作的。

这是一个更具体的例子。

import module1
from module2 import item2
import module3 as my_module3
from module4 import item4 as my_item4
from module5 import *

var1 = module1.func_1
var2 = item2
var3 = my_module3.func_3
var4 = my_item4
var5 = func_5

如何知道var1...var5分别来自哪些模块?

【问题讨论】:

    标签: python


    【解决方案1】:

    在 Python 中可以在不运行代码的情况下确定变量的源模块,但这需要使用比 pylint 或 pyflakes 等 linter 更高级的工具。一种选择是使用像 mypy 这样的静态分析工具,它可以分析您的代码并提供变量的类型信息,包括导入变量的源模块。

    要使用 mypy 确定变量的源模块,您需要在代码上运行 mypy 并将 --show-error-context 选项传递给它。这将导致 mypy 提供有关它发现的每个类型错误的附加信息,包括导入变量的源模块。

    下面是一个示例,说明如何使用 mypy 确定代码中变量的源模块:

    $ mypy --show-error-context my_code.py
    

    这将在您的代码上运行 mypy 并打印它发现的任何类型错误,以及导入变量的源模块。例如,如果您有一个名为 var1 的变量,它被分配了一个来自 module1 的值,mypy 可能会输出以下内容:

     my_code.py:1: error: Cannot determine type of 'var1'
     In function "my_function":
     my_code.py:10: error: "var1" is of type "Any"
      var1 = module1.func_1
      ^
     In module "module1":
     module1.py:1: note: "func_1" is defined here as:
       def func_1():
        ...
    

    此输出表明 var1 被分配了一个来自 module1 的值,并且 var1 的类型由 module1.func_1 的类型确定。

    您还可以使用 mypy 通过传递 --check-variable 选项并指定要检查的变量的名称来检查特定变量的类型。例如:

    $ mypy --check-variable var1 my_code.py
    

    这将在您的代码上运行 mypy 并打印 var1 变量的类型,以及定义该类型的源模块。

    值得注意的是,mypy 并不是一个完美的工具,它不一定总是能够 100% 准确地确定变量的源模块。在某些情况下,它可能无法确定变量的类型,或者可能提供不正确的类型信息。但是,一般来说,mypy 可以为您的代码提供有用的类型信息,包括导入变量的源模块。您可以在 mypy 文档中阅读有关 mypy 及其功能的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-22
      • 2017-10-26
      • 2017-11-26
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      相关资源
      最近更新 更多