0

昨天我在使用 python 的 argparse 库,其中一个特性引起了我的注意。创建解析器实例后,您可以通过将字符串和一些可选值传递给add_argument(). 然后,在调用parse_args()您后,您会得到一个变量,该变量具有以您传递的字符串命名的属性。这是一个例子:

parser = argparse.ArgumentParser()
parser.add_argument('layout', help="CSV File containing coordinates and sensor names")
args = parser.parse_args()
layout = csv.reader(open(args.layout)) # now I have the attribute "layout", very cool!

所以,我对这个名称绑定有点着迷,但我不知道它是如何实现的。谁能解释这是如何工作的?一个例子会很棒。

4

2 回答 2

1

有几种方法可以实现:

用于setattr()动态设置属性值

这就是argparse实际在做的事情。存储动作如下所示:

class _StoreAction(Action):

    def __init__(self,
                 option_strings,
                 dest,
                 nargs=None,
                 const=None,
                 default=None,
                 type=None,
                 choices=None,
                 required=False,
                 help=None,
                 metavar=None):
        if nargs == 0:
            raise ValueError('nargs for store actions must be > 0; if you '
                             'have nothing to store, actions such as store '
                             'true or store const may be more appropriate')
        if const is not None and nargs != OPTIONAL:
            raise ValueError('nargs must be %r to supply const' % OPTIONAL)
        super(_StoreAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            nargs=nargs,
            const=const,
            default=default,
            type=type,
            choices=choices,
            required=required,
            help=help,
            metavar=metavar)

    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, values)

覆盖默认值__getattribute__()

例如从一些外部提供的字典中获取这些值

class Something(object):
    def __init__(self, values_dict):
        self.values_dict = values_dict
    def __getattribute__(self, name):
        try:
            ## by default trying to access "normal" object's attributes
            return super(Something, self).__getattribute__(name)
        except AttributeError: 
            ## in case that it's not "normal" attribute, taking them from our dict
            value = self.values_dict.get(name)
            if value is None:
                ## it wasn't in the dict, re-raise the AttributeError 
                raise 
            else:
                return value

摆弄着__dict__

class Something(object):
    def __init__(self, values_dict):
        self.__dict__.update(values_dict)
于 2013-06-25T13:49:32.423 回答
0

它是通过setattr函数实现的。

基本上,

namespace.foo = value

也可以通过以下方式完成:

setattr(namespace,'foo',value)

就这么简单。还有一个getattr获取属性的内置函数。

于 2013-06-25T13:25:47.923 回答