2010-12-02 88 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++中做的东西。你只需定义的东西。