gpt4 book ai didi

python - 嵌套类中模块的意外 UnboundLocalError

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:26 26 4
gpt4 key购买 nike

我继承了一个遗留单元测试,它试图覆盖嵌套在另一个类中的自定义类的名称 datetime。我现在正在重构它(我同意这很糟糕)但我不明白我看到的特定错误。

我看到了一个UnboundLocalError,我可以用一个独立的例子重现它:

import datetime
class Foo(object):

def inner_scope(self):

real_datetime = datetime
class datetime(datetime.datetime):
@staticmethod
def convert():
return "blah"

x = datetime(2012, 1, 1)
y = x.convert()
return x, y

f = Foo()
f.inner_scope()

我明白了:

In [439]: f.inner_scope()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-439-c5053fb49b64> in <module>()
----> 1 f.inner_scope()

<ipython-input-437-222b3997ec2c> in inner_scope(self)
3 def inner_scope(self):
4
----> 5 real_datetime = datetime
6 class datetime(datetime.datetime):
7 @staticmethod

UnboundLocalError: local variable 'datetime' referenced before assignment

我尝试在类定义中添加 print 语句来打印 type(datetime)type(datetime.datetime) (这有效)并立即在 inner_scope 定义内部(这失败了)。

由于闭包,datetime 的值不应该由导入的模块提供,因为它是从 inner_scope< 中越来越高级别的范围检查的 函数?

据我所知,我也没有尝试修改它,因为我看到了其他 UnboundLocalError 问题,这些问题涉及尝试修改可以通过闭包访问但不会更改的变量,除非首先作为局部变量。

最佳答案

这种情况与您看到的与 UnboundLocalError 相关的其他情况没有什么不同。由于您的内部类也称为 datetime Python 的字节码编译器会将名称 datetime 标记为局部变量。由于您尝试在类声明之前分配 real_datetime = datetime,您会收到错误。

如果你考虑一下,这可能会更清楚

class datetime(datetime.datetime):
...

是等价于的声明:

datetime = type('datetime', (datetime.datetime), {...class members...})

作为此类事情的解决方法,您始终可以为模拟类使用与 datetime 不同的名称。 可能它的名字是什么并不重要(如果它真的很重要,你仍然可以通过在创建类后分配给它的 __name__ 属性来覆盖它)。

在 Python 3 中,您只需像声明任何其他非局部变量一样声明 nonlocal datetime

关于python - 嵌套类中模块的意外 UnboundLocalError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com