我应该如何向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那么,您可以编写一个函数,以您需要的任何方式转换密钥,并在字典理解中使用它。或者你可以扩展你的例子,这样我们就可以研究和解决其他的可能性。对不起,我把我的问题简化了。我用更现实的要求更新了这个问题。