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

python方法原型设计的更好实践,python,function,parameters,Python,Function,Parameters,我必须提供一个pythonsdk,现在我对如何设计这个方法进退两难 也就是说,函数名是func,func必须接受大约10个参数。我知道我们可以这样定义函数: def func(para0, para1, para2, para3, para4, para5, para6, para7, para8, para9) 或 而obj_参数被设计为包含 para0~para9 那么哪一种是蟒蛇式的方式呢?或者两者都可以 基于@deceze的问题,我添加了一些限制:para0~para9名称是字面意义上

我必须提供一个pythonsdk,现在我对如何设计这个方法进退两难

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

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

obj_参数
被设计为包含
para0
~
para9

那么哪一种是蟒蛇式的方式呢?或者两者都可以


基于@deceze的问题,我添加了一些限制:
para0
~
para9
名称是字面意义上的(不能更改为其他名称),
para0
~
param6
是必需的,左边是可选的。

您可以使用
kwargs
代替,并提取字典的参数。我发现这是一个比定义对象更好的解决方案


def func(**kwargs)

您可以改用
kwargs
并提取字典的参数。我发现这是一个比定义对象更好的解决方案


def func(**kwargs)

您的选择很少。
你可以使用

def foo(my_list):  # pass a list as an argument and iterate over elements
    pass


你几乎没有选择。
你可以使用

def foo(my_list):  # pass a list as an argument and iterate over elements
    pass


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

例如,假设您的函数使用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(Class, **kwargs):
    model = Class(**kwargs)
    model.save()
def func(*args):
    average = 0
    for inst in *args:
        average += inst.value
    return average
现在假设这些参数是构建请求的参数,而函数的目的是返回请求的散列(例如,在没有适当身份验证系统的情况下粗略地识别用户),那么关注点的分离将使在函数外部构建请求对象变得合理,并使函数只返回散列,这样您就可以从代码的其他部分生成请求,这样您就可以拥有不同类型的请求对象。那么函数将类似于:

def func(request):
    ...

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

例如,假设您的函数使用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(Class, **kwargs):
    model = Class(**kwargs)
    model.save()
def func(*args):
    average = 0
    for inst in *args:
        average += inst.value
    return average
现在假设这些参数是构建请求的参数,而函数的目的是返回请求的散列(例如,在没有适当身份验证系统的情况下粗略地识别用户),那么关注点的分离将使在函数外部构建请求对象变得合理,并使函数只返回散列,这样您就可以从代码的其他部分生成请求,这样您就可以拥有不同类型的请求对象。那么函数将类似于:

def func(request):
    ...

所有这些都是强制性的还是可选的?有些是可选的,有些是强制性的?它们是非常独特的参数,还是从字面上看它们是param0-9(一个真正的列表)?——如何设计一个API很大程度上取决于它的细节,没有通用的答案。有一个简单的测试-你可以用这个方法编写一些用例,看看是否容易阅读/调试/改进这样的方法调用。对我来说,一个函数接受的参数越多,它就越难使用?我的意思是,他们真的被称为“param0”?!那是非常没有帮助的命名。这是否意味着您真的只是接受一个至少需要7项长度的内容列表…?这些可以字面上称为“bill\u title”、“bill\u price”等等,这里para0只是一个示例如果您为参数创建了一个结构(也许),那么您可以将函数作为一个方法放在类上。看看重构和代码的味道。它们都是强制性的还是可选的?有些是可选的,有些是强制性的?它们是非常独特的参数,还是从字面上看它们是param0-9(一个真正的列表)?——如何设计一个API很大程度上取决于它的细节,没有通用的答案。有一个简单的测试-你可以用这个方法编写一些用例,看看是否容易阅读/调试/改进这样的方法调用。对我来说,一个函数接受的参数越多,它就越难使用?我的意思是,他们真的被称为“param0”?!那是非常没有帮助的命名。这是否意味着您真的只是接受一个至少需要7项长度的内容列表…?这些可以字面上称为“bill\u title”、“bill\u price”等等,这里para0只是一个示例如果您为参数创建了一个结构(也许),那么您可以将函数作为一个方法放在类上。看看重构和代码的味道吧,这是最具python风格的too@Mr.E,视情况而定。可能会有其他具有相同参数的函数-那么最好将它们提取到一个类中;这可能是可取的,也可能是不可取的,在调用端,10个参数可能会非常冗长。@E先生最具Pythonic:Explict比implicit好。它是最具Pythonic的too@Mr.E,视情况而定。可能会有其他具有相同参数的函数-那么最好将它们提取到一个类中;这可能是可取的,也可能是不可取的,而且在调用端,10个参数可能会变得非常冗长。@E先生,大多数Pythonic:Explict比implicit好。