python - 在函数之间传递参数的 pythonic 方式是什么?

标签 python coding-style

我有一些从用户那里获取的参数,并沿着一个函数传递给另一个函数(每个函数在不同的类中),直到它最终到达一个执行某些处理的函数,然后解决方案被返回到链中。在链上,函数变得越来越抽象,合并了较低层函数多次运行的结果。

我应该在哪里使用 *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/

相关文章:

python - str() 在这里代表什么?

python - SQLAlchemy 使用 where 约束进行选择

coding-style - 整洁的架构——在哪里放置输入验证逻辑?

javascript - $.ajax 调用后业务逻辑的推荐位置

swing - 如何在 java swing 中设置样式?

c# - 什么是 C# 静态字段命名约定?

python - 如何判断 django admin 中是否添加或更改了屏幕

Python从文件中打印随机行而不重复

python - Pandas 是否可以在具有时间序列的 csv 列中添加带有空值的新时间值?

scala - Scala 方法 def 什么时候应该使用显式定义的返回类型?