我必须提供一个python sdk,现在我应该如何设计方法陷入困境。
只是说,函数名是 func
,func
必须接受大约 10 个参数。我知道我们可以这样定义函数:
def func(para0, para1, para2, para3, para4, para5, para6, para7, para8, para9)
或
def func(obj_param)
并且obj_param
被设计为一个类实例,其中包含 para0
~para9
.
那么哪种方式是pythonic方式?或者两者都可以?
基于@deceze的问题,我添加了一些限制:para0
~para9
名称是字面上的(不能更改为其他名称),para0
~param6
是强制性的,左边是可选的。
您可以改用kwargs
并提取字典的参数。我发现这是比定义对象更好的解决方案
def func(**kwargs)
你几乎没有选择。
您可以使用
def foo(my_list): # pass a list as an argument and iterate over elements
pass
或
def bar(*args): # pass only arguments
pass
# example
bar("text1", "text2", 2, 3)
或
def foobar(**kwargs): # pass keyword arguments
for key in kwargs:
print(key, str(kwargs[key])) # will print key and value
# example
>>foobar(name="My name" surname="my last name", age=24, weight=80)
('name', 'My name')
('surname', 'my last name')
('age', '24')
('weight', '80')
在我看来,这取决于参数以及您想用它们做什么。
例如,假设您的函数需要 10 个参数来创建和保存具有 10 个字段的模型,那么正确的方法是:
def func(**kwargs):
model = Model(**kwargs)
model.save()
然后让我们假设第一个参数实际上是模型的类,那么它将是:
def func(Class, **kwargs):
model = Class(**kwargs)
model.save()
现在假设所有参数都是模型的实例,并且您想要返回一些组合,那么最合乎逻辑的是:
def func(*args):
average = 0
for inst in *args:
average += inst.value
return average
现在假设参数是构建请求的参数,而你的函数的目的是返回请求的哈希值(例如粗略地识别没有适当身份验证系统的用户),那么关注点的分离将使在函数之外构建请求对象变得合乎逻辑,并使函数只返回哈希, 以便您可以从代码的其他部分生成请求,并且可以拥有不同类型的请求对象。那么函数将是这样的:
def func(request):
...