在python中将多个参数传递给init类的最佳方法是什么?

时间:2012-04-23 17:59:27

标签: python

我在python中创建一个可以接受多个参数的模块。将参数传递给方法定义的最佳方法是什么?

def abc(arg):
    ...

abc({"host" : "10.1.0.100", "protocol" : "http"})
def abc(host, protocol):
    ...

abc("10.1.0.100", "http")
def abc(**kwargs):
    ...

abc(host = "10.1.0.100", protocol = "http")

还是其他什么?

修改

我实际上会有这些参数(用户名,密码,协议,主机,密码2),而这些参数都不是必需的。

3 个答案:

答案 0 :(得分:2)

def abc(host, protocol):
    ...

abc("10.1.0.100", "http")
abc(host="10.1.0.100", protocol="http")

如果使用位置args或关键字args调用它,则取决于参数的数量以及是否跳过任何​​参数。对于您的示例,我没有看到使用关键字args调用函数有多大用处。


现在有些原因导致其他解决方案不好:

abc({"host" : "10.1.0.100", "protocol" : "http"})

这是一种常用于缺少真正关键字args(通常是JavaScript)的语言的关键字参数的解决方法。在那些语言中它很不错,但在Python中它是错误的,因为你从中获得的一切都没有。如果你想用dict调用带有args的函数,你总是可以abc(**{...})

def abc(**kwargs):

人们希望函数能够接受许多 - 甚至是任意的 - 参数。除此之外,他们没有看到可能/需要的参数,你必须编写代码来自己要求某些参数。

答案 1 :(得分:0)

如果提前知道所有参数,请使用显式参数列表,可选择使用默认值,例如def abc(arg1="hello", arg2="world",...)。这将使代码最具可读性。

调用此功能时,您可以使用abd("hello", "world")abc(arg1="hello", arg2="world")。如果有超过4或5个参数,我会使用更长的形式,这是一个品味问题。

答案 2 :(得分:0)

这实际上取决于方法的背景,设计和目的。

如果参数是定义和强制的,那么最好的选择是:

def abc(host, protocol):
    ...

abc('10.1.0.100', 'http')

如果参数已定义但是可选,则:

def abc(host=None, protocol=None): # I used None, but put a default value
    ...

您可以将其称为abc('10.1.0.100', 'http')或其名称abc(protocol='http')

的位置参数

如果你一开始不知道它将收到什么参数(例如在字符串格式化中),那么最好的选择是使用**kwargs参数:

def abc(**kwargs):
    ...

通过这种方式,您必须使用命名参数调用它。