2016-02-01 56 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) 
相關問題