我应该如何向Python中使用的函数传递参数(dict vs variables)?
我有一个函数/方法我应该如何向Python中使用的函数传递参数(dict vs variables)?,python,function,parameters,arguments,Python,Function,Parameters,Arguments,我有一个函数/方法a(),它需要一些参数(包括可选参数)。另一个函数B()对要传递到所述函数A()的数据进行预处理。我几乎没有函数B()的替代实现,这使我对一个函数优于另一个函数的优点感到困惑。 我想知道我应该使用其中的哪一个(如果有的话) 毕竟,应该有一种——最好只有一种——显而易见的方法来做到这一点。 以下是代码片段: class Foo(object): def __init__(self, param1, param2, param3=None): self.p
a()
,它需要一些参数(包括可选参数)。另一个函数B()
对要传递到所述函数A()
的数据进行预处理。我几乎没有函数B()
的替代实现,这使我对一个函数优于另一个函数的优点感到困惑。
我想知道我应该使用其中的哪一个(如果有的话)
毕竟,应该有一种——最好只有一种——显而易见的方法来做到这一点。
以下是代码片段:
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)
在上面的代码中,\uuuuu init\uuuu
指的是A()
,而from\u dump\u v*
代表我需要从中选择的不同实现。注意:在所有情况下,
dump
都是一个包含3个键值对的字典,即param_1
、\u param_2
和paramtree
一个明显的方法是:
@classmethod
def from_dump_v(cls, dump):
return cls(**{k.replace('_', ''): v for k, v in dump.items()})
在
dump
dict包含任意键的情况下,我看不到一种明显的方法来实现这一点;我不是荷兰人
但是,通过对工厂函数的参数进行某种控制,您可以将数据类型更改为序列而不是dict,然后使用枚举
执行一些明显的操作:
@classmethod
def from_dump_v(cls, dump):
return cls(**{"param{}".format(i): x for i, x in enumerate(dump, 1)})
看起来您正在创建一个工厂函数来处理类初始化。因此,要实现这一点,您可以使用
*args
和**kwargs
将任意数量的参数(参数和关键字参数)传递给factory函数。但这似乎是多余的
因此,您可以有如下内容:
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)
y = Foo.from_dump_vx(1, 2, param3=3)
在from_dump_vx
中,您可以根据自己的喜好处理*args
和**kwargs
中的值,然后将它们传递给类的\u init\u
方法
然后可以像这样初始化类:
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)
y = Foo.from_dump_vx(1, 2, param3=3)
但是我可能并不总是想替换
。
@KshitijSaraogi那么,您可以编写一个函数,以您需要的任何方式转换密钥,并在字典理解中使用它。或者你可以扩展你的例子,这样我们就可以研究和解决其他的可能性。对不起,我把我的问题简化了。我用更现实的要求更新了这个问题。