Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入文件中的类型提示解析运行名称错误异常_Python_Python 3.x_Type Hinting - Fatal编程技术网

Python 导入文件中的类型提示解析运行名称错误异常

Python 导入文件中的类型提示解析运行名称错误异常,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我现在正在对类型提示进行一些分析,并在python中解析这些类型提示,我想澄清一下我发现的一个具体问题 问题 使用导入的模块解析类型提示时,无法解析类型提示。特别是导入模块中的globals()没有从调用类方法/函数的文件中定义的依赖项。为什么这种行为是故意的 安装程序 要了解问题,您可以查看PEP文档。本质上,我发现的问题在文档中有说明,但我想知道这种行为是否永远不会改变 为了描述这个问题,我将设置一个检查,您可以复制粘贴。有两个类和一个伪类来演示由于循环依赖性而需要使用类型检查。每个文件都应

我现在正在对类型提示进行一些分析,并在python中解析这些类型提示,我想澄清一下我发现的一个具体问题

问题 使用导入的模块解析类型提示时,无法解析类型提示。特别是导入模块中的
globals()
没有从调用类方法/函数的文件中定义的依赖项。为什么这种行为是故意的

安装程序 要了解问题,您可以查看PEP文档。本质上,我发现的问题在文档中有说明,但我想知道这种行为是否永远不会改变

为了描述这个问题,我将设置一个检查,您可以复制粘贴。有两个类和一个伪类来演示由于循环依赖性而需要使用类型检查。每个文件都应另存为一个单独的文件。我之所以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

A.py类

from\uuuuu future\uuuuu导入注释
从键入导入类型检查
如果类型_检查:
从classb导入栏
类别1(对象):
定义初始化(self,dep1:Bar):
通过
B.py类

from\uuuuu future\uuuuu导入注释
从键入导入类型检查
如果类型_检查:
从classa导入Foo1
类别2(对象):
#foo1是一个循环依赖项,因为foo1需要并导入了Bar
#为了防止引发异常,我们需要导入类型检查
定义初始化(self,circDep1:Foo1):
通过
类栏(对象):
定义初始化(自):
通过
typehint.py

从输入import获取\u type\u提示
进口检验
def执行提示分析(cls):
打印(获取类型提示(cls)
args=inspect.signature(cls\u t.\uuuu init\uuuuuu)
打印(参数['dep1'].注释)
n=args.parameters['dep1'].annotation
打印(类型(参数['dep1'].注释))
打印(eval(n,globals(),locals())
main.py:入口点文件,即您运行的文件

从类型提示导入执行提示分析
从classa导入Foo1
从classb导入栏
def main():
执行提示分析(Foo1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
当您运行
main.py
时,将出现以下错误:

  % python main.py                                                                                                                                                                                                   !6886
{}
Bar
<class 'str'>
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    main()
  File "test.py", line 5, in main
    perform_hint_analysis(Foo1)
  File "typehint.py", line 11, in perform_hint_analysis
    print(eval(n, globals(), locals()))
  File "<string>", line 1, in <module>
NameError: name 'Bar' is not defined
typehint.py更改

。。。
def执行提示分析(cls、gl):
...
打印(eval(n,gl,locals())
完成分析后,修复非常简单。其他导入文件中的类是否总是无法发现?我知道一些关于python导入的知识以及它们是如何解决的,但我想知道的是对“为什么”的更深入的理解。对于反射和类型,使用类型对功能进行分析非常好,因为从长远来看,这些功能可以节省时间,所以我有兴趣了解这种行为的未来轨迹,特别是Python

我感谢你的时间和投入

谢谢