如何在Python中将参数传递给函数(使用字典还是变量)?

2024-10-01 04:50:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数/方法A(),它需要一些参数(包括可选参数)。另一个函数B()对要传递给所述函数A()的数据进行预处理。我很少有函数B()的替代实现,这使我对两者的优点产生了混淆。 我想知道其中哪一个(如果有的话)我应该使用。你知道吗

毕竟,There should be one-- and preferably only one --obvious way to do it.

以下是代码片段:

class Foo(object):

    def __init__(self, param1, param2, param3=None):
        self.param1 = param1
        self.param2 = param2
        self.param3 = param3

    @classmethod
    def from_dump_v1(cls, dump):
        param1, param2, param3 = dump.get('param_1'), dump.get('_param_2'), dump.get('paramThree')
        return cls(param1, param2, param3)

    @classmethod
    def from_dump_v2(cls, dump):
        dump['param1'] = dump.pop('param_1')
        dump['param2'] = dump.pop('_param_2')
        dump['param3'] = dump.pop('paramThree')
        return cls(**dump)

    @classmethod
    def from_dump_v3(cls, dump):
        result = dict()
        result['param1'] = dump.get('param_1')
        result['param2'] = dump.get('_param_2')
        result['param3'] = dump.get('paramThree')
        return cls(**result)

在上面的代码中,__init__表示A()from_dump_v*表示我需要从中选择的不同实现。
注意:在所有情况下,dump是一个具有3个键值对的字典,即param_1_param_2paramThree。你知道吗


Tags: 函数fromselfgetreturnparamdefresult
2条回答

一个显而易见的方法是:

@classmethod
def from_dump_v(cls, dump):
    return cls(**{k.replace('_', ''): v for k, v in dump.items()})

dumpdict持有任意键的情况下,我看不到一种明显的方法来做到这一点;我不是荷兰人。你知道吗

但是,通过对工厂函数的参数进行一些控制,可以将数据类型更改为序列而不是dict,然后使用enumerate执行一些明显的操作:

@classmethod
def from_dump_v(cls, dump):
    return cls(**{"param{}".format(i): x for i, x in enumerate(dump, 1)})

似乎您正在创建一个工厂函数来处理类初始化。因此,要实现这一点,可以使用*args**kwargs将任意数量的参数(参数和关键字参数)传递给工厂函数。但这似乎是多余的。你知道吗

因此,您可以有如下内容:

class Foo(object):
    def __init__(self, param1, param2, param3=None):
        self.param1 = param1
        self.param2 = param2
        self.param3 = param3

    @classmethod
    def from_dump_vx(cls, *args, **kwargs):
      return cls(*args, **kwargs)

from_dump_vx中,您可以根据自己的偏好处理*args**kwargs中的值,然后将它们传递给类的__init__方法。你知道吗

然后你可以像这样初始化你的类:

y = Foo.from_dump_vx(1, 2, param3=3)

相关问题 更多 >