首页 > 编程问答 >局部变量类型注释不会引发 NameError

局部变量类型注释不会引发 NameError

时间:2024-07-23 13:09:23浏览次数:10  
标签:python python-3.6 python-typing

在Python 3.6中,语言中引入了新的 变量注释

但是,当类型不存在时,可能会发生两种不同的情况:

>>> def test():
...     a: something = 0
... 
>>> test()
>>> 
>>> a: something = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'something' is not defined

为什么要处理不存在的类型行为不同?难道它不会潜在地导致人们忽略函数中未定义的类型吗?


注释

尝试使用Python 3.6 RC1和RC2 - 相同的行为。

PyCharm突出 something 在两者中都作为“未解析的引用”和函数之外。


Python 中局部变量类型标注的行为差异是设计使然,并符合该语言处理名称解析的方式。 让我们来分析一下原因。

1. 作用域

  • 全局作用域: 当在全局作用域(如的示例中 a: something = 0 )中编写类型标注时,Python 会将其视为对尚未定义的名称的常规引用。由于 Python 在执行之前进行名称解析,因此会立即引发 NameError

  • 局部作用域: 在函数内部,类型标注在函数定义时不进行评估。这是因为 Python 使用了一种称为“延迟标注评估”的机制。类型标注仅在需要时进行评估,例如使用类型提示工具或在运行时进行类型检查。

2. 标注的目的

类型标注的主要目的是提供有关的代码的提示信息。它们并非旨在在运行时强制执行严格的类型检查(除非使用像 MyPy 这样的工具)。因此,函数内部缺少类型定义不会导致运行时错误。

3. 为什么不在函数内部引发 NameError

  • 前向引用: 可能在函数稍后定义了该类型,或者它可能来自尚未导入的模块。在定义时引发错误会妨碍前向引用和循环依赖。
  • 动态类型: Python 是一种动态类型语言,允许在运行时灵活地更改变量的类型。在函数定义时强制执行严格的类型检查与 Python 的动态性质相冲突。

4. 潜在的缺点和缓解措施

是正确的,这种行为可能会导致在函数中忽略未定义的类型。但是,可以使用以下方法来缓解这种情况:

  • 类型检查工具: 使用 MyPy 等工具在的代码上执行静态类型检查。MyPy 会捕获到这些未定义的类型并发出错误。
  • Linters: 使用 PyCharm 或 VS Code 等支持类型标注的 linter。它们通常会突出显示未定义的类型作为警告。

总而言之, Python 中局部变量类型标注的行为差异是设计使然,并且符合该语言的动态性质和标注的主要目的。了解此行为并利用类型检查工具可以帮助编写更健壮、更易于维护的代码。

标签:python,python-3.6,python-typing
From: 41291892

相关文章

  • Python 类型提示和 linter
    我一直在向我们的python项目添加静态类型检查,例如像这样:fromtypingimportListfromsomethingimportMyOtherClassclassMyClass:def__init__(self)->None:self.some_var=None#type:List[MyOtherClass]但是,现在我们使用的linter(flake8和......
  • eclipse如何写python程序
    本文主要介绍在Windows系统环境下,搭建能在Eclipse中运行python程序的环境。一、Eclipse下载与安装:Eclipse是写JAVA的IDE,下载地址为:http://www.eclipse.org/downloads/下载安装,网上教程很多,不赘述。二、pydev插件下载与安装:启动Eclipse,点击Help—>EclipseMarketplace......
  • 运行 python 3 代码时出现 python 2 语法错误
    我有一个如下所示的类classExperimentResult(BaseDataObject):def__init__(self,result_type:str,data:dict,references:list):super().__init__()self.type=result_typeself.references=referencesself.data=data......
  • 如何让 python 类型检查器知道它应该返回其类的新实例?
    我想使用classmethod返回当前类的新实例,并且我尝试了如下代码,但它引发了NameError('name'T'isnotDefined')PutthecodeT=TypeVar('T',bound=A)on|||以上也不起作用。classA有什么好主意来处理它吗?Isthereanygoodideatohandleit?......
  • 由于循环依赖而导致的Python注释错误
    我有两个相互依赖的类,并且无需注释即可正常工作。不幸的是,当我尝试注释返回值时,它会导致预期循环依赖错误。Network.pydefprocessors(self)->List[Processor]:#implementationProcessor.pydefnetwork(self)->Network:......
  • 如何在python中发送带有请求的“multipart/form-data”?
    如何在Python中使用multipart/form-data发送requests?如何发送文件,我明白,但是如何通过这种方法发送表单数据无法理解。可以使用Python中的requests库来发送multipart/form-data请求。说得对,requests库可以轻松发送文件,并且发......
  • 我安装了哪个版本的 Python?
    我必须在Windows服务器上运行Python脚本。我如何知道我拥有哪个版本的Python,这真的很重要吗?我正在考虑更新到最新版本的Python。确定在Windows服务器上安装的Python版本至关重要,因为它可以确定脚本的兼容性和可用库。以下是检查方法:使用命令提......
  • @classmethod 在 Python 的类之外做什么?
    在下面的代码中,如果存在@classmethod注释,则允许内部defnew()代替目标的__new__()--但该类会传递两次。如果@classmethod被删除,那么我们会收到类似“”的错误。@classmethod这里在做什么,有没有办法不用它?(我的动机是清晰的:我不理......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......
  • 如何让SublimeText支持Python 3的注释?
    我测试了SublimeText2和3,两者都有错误:如果您测试此代码,您会注意到:之后的所有代码都不会正确突出显示语法。deffoo(a,b)->str:#Nothinggetsproperlycoloredfromhere#Abunchofcode…return"bar"我发现了一些链接,解释了如何......