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 に答える