簡體   English   中英

在 Python 中的函數之間傳遞值的最佳實踐

[英]best practice for passing values between functions in Python

允許一個 function 使用另一個函數的返回值的 pythonic 最佳實踐是什么? 例如,在另一個中調用一個 function 是否更好,或者 function1 返回到 class 並分配 class 變量更好,然后由 function2 使用? 其次,您可以在函數之間傳遞多少種不同的值?

class adding:

    def get_values(self):
        x = input("input x")
        y = input("input y")
        z = input("input z")
        return x, y, z

    def use_values(self, x, y, z):
        print x+y+z

if name == 'main':
    dave = adding()
    x, y, z = dave.get_values()
    dave.use_values(x, y, z)

或者

    dave = adding()
    dave.use_values(*dave.get_values())

正如import this所說,“顯式優於隱式”; 所以 go 與第一種形式。

如果返回值的數量變大,讓use_value的是一個序列參數。

所有方法都是有效的,並且完全取決於您的主題領域和功能的划分,關注點的分離。 換句話說,它取決於.

例如,您可能有一個 class,其公共 API 有 2 個方法,它們都依賴於您認為是私有的第三種方法。 作為開發人員,您可以選擇不將第三種方法作為公共 API 的一部分,但它在您的源代碼中:

class FooAPI(object):
    def publicMethodOne(*args, **kw):
        return self._privateMethod(1, *args, **kw) + 7

    def publicMethodTwo(*args, **kw):
        return self._privateMethod(2, *args, **kw) + 11

    def _privateMethod(somevalue, *args, **kw):
        return somevalue * 3

在這種情況下,您的 API 的用戶絕對不需要直接調用_privateMethod並將其返回值傳遞給publicMethod

但是,如果您認為 API 的使用者應該為您的方法提供特定信息,在大多數情況下,有一個簡單的默認方法可以為他們計算特定信息,您可能希望傳入該默認方法的返回值. 這樣,這些消費者也可以使用他們自己的計算方法並使用這些值來代替

def publicMethod(value1, value2):
    return value1 / value2

def mostCommonValues():
    return (1.0, 4.0)

publicMethod(*mostCommonValues())
publicMethod(4, 2)

以及何時使用實例變量? 僅當 function 的返回值與實例保持一致時,當它們反映該實例的內部 state 時。

例如,如果您的 class 代表一輛汽車,那么您的應用程序在對該汽車的操作之間存儲汽車的位置可能是有意義的 所以如果你想知道它現在是否需要停下來等紅綠燈,首先調用updatePosition()方法,然后用另一個方法計算到紅綠燈的距離。 您不會將updatePosition()調用的 output 傳遞給距離計算方法,您只需在實例中更新 position 即可。

但是,如果您需要在碰撞中更新汽車的 position,則需要從汽車獲取數據(基於汽車上調用的方法的返回值),並結合外部信息(其他 object 的位置、電阻路面等)反饋到汽車上的updatePosition方法。 因為您現在需要從汽車實例外部添加其他信息,所以您必須通過公共 API 將值從一個方法調用傳遞到另一個方法調用。

請記住,軟件開發與其說是嚴格的工程學科,不如說是一種藝術形式,因此如何做到這一點的答案因開發人員和軟件項目而異。 從來沒有一個答案。 試着讓它明確、明顯、自然。

我認為get_values不是添加的重要部分,因此應該是單獨的 function。 如果應該是我會說:

class adding:

def get_values(self):
    self.x = input("input x")
    self.y = input("input y")
    self.z = input("input z")

def use_values(self):
    print self.x+self.y+self.z

if name == 'main':
    dave = adding()
    dave.get_values()
    dave.use_values()

是一個更合理的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM