2016-02-01 29 views
0

根据Clean Code,函数应尽可能采用零参数。调用具有零参数的Python函数/方法

如果我们举一个小例子用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 

它似乎并不值得努力。在这个例子中有没有实现无参数函数的方法?

+3

我猜谁说的意思只是你不应该具备的功能有20个参数。当然在你的情况下,有一个参数是完全合理的。 – nbro

+0

只是回声的@nbro,在这种情况下,假设你的函数只有一个参数是合乎逻辑的。这不会使代码变得不那么干净。如果你想让这个参数少一些,你总是可以提示参数。通过让函数提示它,让呼叫者输入数字添加两个(如果用例允许这样的可能性) – Amit

+2

您的方法仍然采用参数'self' ... – Fabricator

回答

2

你为什么不使用默认参数方法

def add_two(x=0): 
    return x + 2 
>>> add_two(1) 
3 
>>> add_two() 
2 
>>> 
3

如果我们举一个小例子在Python与不 无非就是加2,无论是传递给它的函数: 。 .. 有没有在这个 例子中实现无参数函数的另一种方法?

总之,没有。 用几句话来说:根据定义,你的函数需要一个参数。没有争论就没有办法发生争论。

+2

做功能的唯一方法是让函数接受一个参数。 –

+0

@ TadhgMcDonald-Jensen是的,我会接受这个等价的,更精确的陈述。 –

+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 

面向对象设计

或者,如果我想使用特定namedtuple了很多不同的任务,我可以继承它,然后得到一个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) 
相关问题