0

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

定义 abc(arg):
    ...

abc({“主机”:“10.1.0.100”,“协议”:“http”})
def abc(主机,协议):
    ...

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

abc(主机=“10.1.0.100”,协议=“http”)

或者是其他东西?

编辑

实际上,我将拥有那些不需要它们的参数(用户名、密码、协议、主机、密码2)。

4

3 回答 3

2
def abc(host, protocol):
    ...

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

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


现在其他解决方案不好的一些原因:

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

这是在缺少真正关键字参数的语言(通常是 JavaScript)中常用的关键字参数的解决方法。在那些语言中它很好,但在 Python 中它是错误的,因为你绝对没有从中获得任何好处。如果您想从 dict 中使用 args 调用函数,abc(**{...})无论如何您都可以这样做。

def abc(**kwargs):

人们期望该函数接受很多——甚至可能是任意的——参数。除此之外,他们看不到哪些参数是可能的/需要的,您必须自己编写代码来要求某些参数。

于 2012-04-23T18:01:53.470 回答
0

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

调用函数时,可以使用abd("hello", "world")abc(arg1="hello", arg2="world")。如果参数超过 4 或 5 个,我会使用较长的形式,这是个人喜好问题。

于 2012-04-23T18:03:13.377 回答
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):
    ...

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

于 2012-04-23T18:10:22.233 回答