我应该如何将参数传递给 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

一个明显的方法是

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

dump字典持有任意键的情况下,我看不到一种明显的方法来做到这一点;我不是荷兰人。

但是,通过对工厂函数的参数进行一些控制,您可以将数据类型更改为序列而不是字典,然后对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)

最新更新