0

我想编写一个可以从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

为什么?

这是正确的方法吗?

4

1 回答 1

3

foo_default是 上的一个属性MyClass,因此您需要限定:

self.foo = kwargs.get('foo', self.foo_default) or self.foo_default
于 2013-11-05T23:01:35.557 回答