我有一些从用户那里获取的参数,并沿着一个函数传递给另一个函数(每个函数在不同的类中),直到它最终到达一个执行某些处理的函数,然后解决方案被返回到链中。在链上,函数变得越来越抽象,合并了较低层函数多次运行的结果。
我应该在哪里使用 *args
和 **kwargs
?
我认为 *args
和 *kwargs
可以用于函数不显式使用参数的每个函数。但是,需要在 top_level
定义实际参数,以便用户知道函数需要什么。
我应该在哪里定义输入的含义?
我认为它们应该在 top_level
定义,因为这是最终用户可能希望查看其文档的地方。
我应该在哪里定义什么默认值?
同样,我认为它们应该在 top_level
定义,因为这是最终用户与之交互的地方。
这是一个简单的例子来演示参数的传递,我没有展示函数如何变得越来越抽象或者它们如何与不同的类交互,因为我觉得这是不必要的细节。
def top_level(a=1, b=1, c=1, d=1, e=1):
""" Compute sum of five numbers.
:param a: int, a
:param b: int, b
:param c: int, c
:param d: int, d
:param e: int, e
:return: int, sum
"""
return mid_level(a, b, c, d, e)
def mid_level(*args, **kwargs):
return bottom_level(*args, **kwargs)
def bottom_level(a, b, c, d, e):
return a + b + c + d + e
print top_level(1, 2, 3)
8
是否有像这样传递参数的 Python 约定?
最佳答案
我不会回答您的问题,因为这就像回答“使用 Screwdriver 拧紧螺母的最佳方式是什么?”这样的问题。 IE。我不相信您要求使用 (*args
和 **kwargs
) 指导的工具旨在解决您想解决的问题。
相反,我会回答这个问题:“我如何将一些数据与一组函数相关联?”,答案显然是使用类。
欢迎使用面向对象编程。我想你会喜欢的!
这是我的意思的一个非常基本的例子,但是很难确切地知道你想要从你的例子中得到什么,因为它很简单,但基本原则是将你的数据封装在一个类中,然后使用类的方法。
- 然后您可以在类中的方法之间调用,而无需始终传递大量参数(例如下面的
.calculate()
方法),您不知道顶层将需要或底层。 - 您可以只在一个地方记录参数,即
__init__
方法。 - 您可以通过对代码透明的子类化进行自定义(因为如果您覆盖子类中的方法,它仍然可以被更通用的父类(super class)使用),就像我对
.reduce(x, y)
下面的方法。
例子:
class ReductionCalculator:
def __init__(self, *args):
self.args = args
def calculate(self):
start = self.args[0]
for arg in self.args[1:]:
start = self.reduce(start, arg)
return start
class Summer(ReductionCalculator):
def reduce(self, x, y):
return x + y
class Multiplier(ReductionCalculator):
def reduce(self, x, y):
return x * y
summer = Summer(1, 2, 4)
print('sum: %d' % (summer.calculate(),))
multiplier = Multiplier(1, 2, 4)
print('sum: %d' % (multiplier.calculate(),))
关于python - 在函数之间传递参数的 pythonic 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43003408/