2017-05-04 23 views
0

我有幾個變量我想把它們看作常量,因爲它們從不改變,並且在我的項目中被大量不同的函數使用。我需要能夠從幾個不同的模塊訪問常量,並且我發現的建議建議將常量放入我的config.py中,然後在每個模塊中使用from config import CONSTANT1在幾個不相關的函數中使用常量的正確方法

我的問題是這樣的:我不確定在這種情況下實際使用常量的最Pythonic方法?下面的示例選項是否正確,或者取決於您想要做什麼?有沒有不同的正確我沒有想到的方式?

def fake_function(x, y): 
    # Problem: function relies on the module-level environment for an input 
    # (Seems sloppy) 
    return (x + y + CONSTANT1) 

def fake_function2(x, y, z=CONSTANT1): 
    # Problem: seems redundant and as if there was no point in declaring a constant 
    # Also you end up with way too many parameters this way 
    return (x + y + z) 

class Fakeness(object): 
    def __init__(self): 
     self.z = CONSTANT1 
    def fake_sum(self, x, y): 
     return (x + y + self.z) 
     # Problem: I suspect this might be the correct implementation - but 
     # I hope not because my understanding of OOP is weak :) I also don't 
     # think this helps me with my many functions that have nothing to do 
     # with each other but happen to use the same constants? 
+0

我不明白你認爲第一個選項是錯誤的。 –

+0

我真的只是檢查它*是否被認爲是正確的:)我對函數的理解受到'R'和閱讀函數式編程的影響,我對它是否有點混淆了適當地依賴於全局(或者在這種情況下,模塊級別)的環境或者如果函數需要自包含。我也有興趣開始單元測試我的工作(我不知道該怎麼做),我不清楚如果依靠一個常量是一個壞主意/最終會引入難以理解的錯誤 – HFBrowning

+1

IME當你依賴_mutable_全局狀態時,單元測試只會變得複雜。常量在程序生命週期中不會改變,因此在函數內引用它們不會增加潛在代碼路徑的數量。在這方面,它們並不比直接使用文字值更糟糕。 – Kevin

回答

1

是的,你可以這樣做,這很常見。另外一個常見的方法是使用/ abuse類作爲命名空間,所以你只需要導入一個地方,並且可以改變常量的工作方式。我做這樣的事情:

class Settings(object): 
    TIMEOUT = 4 
    RETRY = 2 
    SECRET_KEY = 'foobar' 

然後你就可以導入設置,到處傳遞它,或者如果你以後需要,甚至改變當你索取或者通過與GETATTR或元類兩輪牛車工作集Settings.FOO會發生什麼。只是一個很好的未來打樣。

相關問題