我在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),而这些参数都不是必需的。
答案 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):
...
通过这种方式,您必须使用命名参数调用它。