python方法原型设计的更好实践

时间:2016-01-21 12:54:09

标签: python function parameters

我必须提供一个python sdk,现在我应该如何设计该方法陷入两难境地。

只是说,函数名称是funcfunc必须接受大约10个参数。我知道我们可以这样定义函数:

def func(para0, para1, para2, para3, para4, para5, para6, para7, para8, para9)

def func(obj_param)

并且obj_param被设计为包含的类实例 para0para9

然后哪个是pythonic方式?或两者都可以吗?

根据@ deceze的问题,我添加了一些限制:para0para9名称字面意思(不能更改为其他名称),para0〜{{1必须是强制性的,左边是可选的。

3 个答案:

答案 0 :(得分:3)

您可以使用kwargs代替并提取字典的参数。我觉得它比定义一个对象更好的解决方案

def func(**kwargs)

答案 1 :(得分:1)

您的选择很少 你可以使用

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

答案 2 :(得分:1)

在我看来,这取决于参数以及你想用它们做什么。

例如,假设您的函数需要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):
    ...