我想编写一个可以从argparse
对象或通常方式初始化的类。这是我的尝试:
class MyClass () :
foo_default = 10
def __init__ (self, *args, **kwargs) :
if len(args) > 0 :
if len(kwargs) == 0 :
kwargs, = args
else : raise Exception("MyClass: cannot mix anonymous & named")
# double defaulting because a missing command line arg results in a
# present key but None value and the default is ignored
self.foo = kwargs.get('foo', foo_default) or foo_default
@staticmethod
def add_arguments (parser) :
parser.add_argument('-foo', type=int, help='for MyClass')
我打算像这样使用它:MyClass(foo=42)
或者像这样:
import argparse
parser = argparse.ArgumentParser(description='...')
MyClass.add_arguments(parser)
args = parser.parse_args()
mc = MyClass(args.__dict__))
然而,我收到此错误:
NameError: global name 'foo_default' is not defined
为什么?
这是正确的方法吗?
答案 0 :(得分:3)
foo_default
是MyClass
上的属性,因此您需要符合条件:
self.foo = kwargs.get('foo', self.foo_default) or self.foo_default