作者:起五贪黑_719 | 来源:互联网 | 2022-11-24 14:31
我想使用内部类的实例(在这种情况下,namedtuple
尽管对于定义的内部类,出现完全相同的症状class
)作为外部类方法的默认值(在本例中为构造函数).但是,当从其他模块导入此代码时,外部类定义似乎缺失.
例:
# mymodule.py
from typing import NamedTuple, Tuple
class IdSignal():
Cfg = NamedTuple('IdSignalCfg', [
('nfft', int),
('limits', Tuple[float, float]),
('min_spacing', float),
('nmix', int)])
Cfg.__new__.__defaults__ = (
512,
(1500, 7500),
200,
3
)
def __init__(self, cfg = IdSignal.Cfg()):
self.cfg = cfg
现在执行import mymodule
抛出:
Exception has occurred: NameError
name 'IdSignal' is not defined
File "...", line 18, in IdSignal
def __init__(self, cfg = IdSignal.Cfg()):
File "...", line 5, in
class IdSignal():
...
import mymodule
令人困惑的是,pylint和mypy都无法识别上述代码中的任何错误.
这可以通过其他方式实现吗?
我知道我可以使用None
默认值并IdSignal.Cfg
在构造函数中实例化.如果这是唯一的解决方案,我想了解为什么上面的代码失败了?
1> chepner..:
在__init__
定义时,名称IdSignal
尚未绑定到类.(在评估语句的整个主体之前不会发生这种情况class
,并且该评估的结果将传递给相关的元类.)但是,Cfg
它还不是类属性; 它只是在定义的相同"范围"中的名称__init__
,因此您无需限定名称.
def __init__(self, cfg=Cfg()):
self.cfg = cfg
class
像这样的陈述
class Foo:
x = 3
def __init__(self, y):
self.y = y
大致相当于
# These names don't really matter, but I'm using different
# names than what the attributes will be just to emphasize
# the point that they really are distinct objects before
# the new class is ever created.
class_x = 3
def some_init(self, y):
self.y = y
Foo = type('Foo', (object,), {'__init__': some_init, 'x': class_x})
请注意,名称Foo
直到最后才会出现.甲class
语句不定义一个新的范围等的模块或功能的做法,但也不是在一个已定义的名称class
的任何封闭范围的陈述部分; 将它们视为临时名称,在创建类后将其丢弃.