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



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

只是说,函数名是 funcfunc必须接受大约 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):
    ...

最新更新