根据Clean Code,函数应尽可能采用零参数。
如果我们在Python中使用一个简单的例子来做一个函数,除了向传递给它的任何内容添加2之外什么都不做:
def add_two(x):
return x + 2
>add_two(1)
3
我能看到这样一个函数传递零参数的唯一方法是将它合并到一个类中:
class Number(object):
def __init__(self, x):
self.x = x
def add_two(self):
return self.x + 2
>n = Number(1)
>n.add_two()
3
这似乎不值得努力。在这个例子中是否有另一种实现无参数函数的方法?
答案 0 :(得分:3)
如果我们在Python中用一个函数来做一个简单的例子 只是将2添加到传递给它的任何内容: ... 是否有另一种方法可以实现无争论功能 示例
总之,没有。 用几个词来说:根据定义,你的函数需要一个参数。如果不参与争论,就无法进行辩论。
答案 1 :(得分:3)
一般
这是非常糟糕的一般建议,没有参数方法对于以需要无外部数据的方式修改对象的对象,或者只与全局变量进行交互的函数(你应该真的有)最小化需要这样做)。在您的情况下,您需要使用外部数据修改给定对象,并且这两个对象都是内置类型(int
)。
在这种情况下,只需使用带有两个参数的函数。
参数太多
现在,这里的建议变得更好了。说我需要做一个复杂的任务,有很多论点。
def complicatedfunction(arg1, arg2, arg3, arg4, arg5, arg6):
'''This requires 6 pieces of info'''
return ((arg1 + arg2) / (arg3 * arg4)) ** (arg5 + arg6)
在这种情况下,您制作了不可读的代码,并且应该将参数数量减少到 5或更少。
减少参数计数
在这种情况下,您可以传递一个namedtuple:
from collections import namedtuple
Numbers = namedtuple("Numbers", "numerator denominator exponent")
mynumber = Numbers(1+2, 3+4, 5+6)
def complicatedfunction(number):
return (number.numerator / number.denominator) ** (number.exponent)
这样做的另一个好处是,您的代码将来很容易修改。假设我需要添加另一个参数:我可以将其作为值添加到namedtuple中。
from collections import namedtuple
Numbers = namedtuple("Numbers", "numerator denominator exponent add")
mynumber = Numbers(1+2, 3+4, 5+6, 2)
def complicatedfunction(number):
value = (number.numerator / number.denominator) ** (number.exponent)
return value + number.add
面向对象设计
或者,如果我想将该特定的命名元组用于许多不同的任务,我可以将其子类化,然后为特定目标获取0参数方法。我可以添加任意数量的方法,这允许我以多种方式使用对象,如下所示:
from collections import namedtuple
class Numbers(namedtuple("Numbers", "numerator denominator exponent add")):
def process(self):
value = (self.numerator / self.denominator) ** (self.exponent)
return value + self.add
mynumber = Numbers(1+2, 3+4, 5+6, 2)
答案 2 :(得分:2)
为什么不使用默认参数方法
def add_two(x=0):
return x + 2
>>> add_two(1)
3
>>> add_two()
2
>>>