2010-12-02 45 views
3

我對python編程(C/C++背景)頗爲陌生。 我正在寫代碼,我需要使用複雜的數據結構,如字典的列表字典。 問題是,當我必須使用這些對象時,我幾乎不記得它們的結構以及如何訪問它們。 這使得很難繼續處理幾天未觸及的代碼。 一個非常糟糕的解決方案是爲每個變量使用註釋,但這非常不靈活。 因此,考慮到python變量只是指向內存的指針,並且它們不能靜態類型聲明,那麼是否有任何約定或規則可用於緩解複雜的數據結構使用?在python中聲明覆雜數據結構的類型

+0

使用好名字? ;) – delnan 2010-12-02 17:18:41

+1

如果字典正在使用已知的固定鍵集,則可能更自然地使用類,就像在C++中一樣。否則,我會嘗試選擇信息名稱。 – 2010-12-02 18:06:55

+0

對於Russel,感謝您的評論,但我認爲字典非常適​​合我在代碼中所做的事情,使用類將是徒勞的。一般來說,你的建議值得牢記。 – 2010-12-02 20:46:55

回答

3

如果您在課程中使用docstrings,那麼您可以使用help(vargoeshere)來了解如何使用它。

+0

感謝您的回答,所有事情都認爲最好的解決方案是使用註釋和優秀的自我說明變量名稱(當然,沒有匈牙利符號(感謝pillmuncher))。 – 2010-12-02 20:51:01

1

我相信你應該好好看看你的一些複雜結構,你在做什麼,然後問......這是Pythonic?在這裏問問。我認爲你會發現一些複雜性是C/C++的人爲因素的情況。

0

在您的代碼中或您的測試中包含一個示例。

2

不管你做什麼,不要重複,不要使用匈牙利符號!它會導致嚴重的腦部腐爛。

那麼,你可以做什麼? Python和C/C++完全不同。在C++中,你通常處理多態調用,像這樣:

void doWithFooThing(FooThing *foo) { 
    foo->bar(); 
} 

動態多態性在C++依賴於繼承:傳遞給doWithFooThing指針只能指向FooThing的實例或子類之一。並非如此在Python:

def do_with_fooish(fooish): 
    fooish.bar() 

在這裏,任何足夠fooish的事情(即具有可調用的酒吧屬性的一切)都可以使用,不管它是如何通過繼承相關型號爲任何其他fooish事情。

這裏的關鍵是,在C++中,你知道每個對象有什麼(base-)類型,而在Python中你不知道,而且你不關心。您嘗試在Python中實現的代碼可以在儘可能多的情況下重用,而不必在類繼承的嚴格規則下強制執行。你的命名也應該反映這一點。你不寫:

def some_action(a_list): 
    ... 

但:

def some_action(seq): 
    ... 

其中序列可能不僅是一個名單,但可迭代的序列,無論是列表,元組,字典,設置,迭代器,等等。

通常,您將重點放在代碼的意圖上,而不是其類型結構。而是寫:

dict_of_strings_to_dates = {} 

你寫:

users_birthdays = {} 

它還有助於比C/C保持功能短,更是如此++。然後你將很容易看到發生了什麼。

另一件事:你不應該把Python變量看作是指向內存的指針。他們其實dicionary條目:

assert foo.bar == getattr(foo, 'bar') == foo.__dict__['bar'] 

並不總是準確所以,我同意,但在細節上可以在docs.python.org進行查找。

而且,在Python中,你不要聲明像你在C/C++中做的東西。你只需定義的東西。