繁体   English   中英

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

[英]What is the best way to pass multiple parameters to class init in 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),其中不需要它们。

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):

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

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

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

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

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

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):
    ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM