在Python中为复杂数据结构声明类型
我刚开始学习Python编程,之前是学C/C++的背景。
我在写代码的时候需要用到一些复杂的数据结构,比如字典里面还有字典,字典里面还有列表。
问题是,当我需要使用这些对象的时候,我几乎记不住它们的结构,也不知道怎么去访问它们。
这让人很难在几天没动的代码上继续工作。
一个很糟糕的解决办法是给每个变量加注释,但这样太不灵活了。
所以,考虑到Python的变量其实只是指向内存的指针,而且不能静态声明类型,有没有什么约定或者规则可以帮助我更好地使用这些复杂的数据结构呢?
4 个回答
我觉得你应该仔细看看你的一些复杂结构,想想你是怎么使用它们的,然后问问自己……这样做符合Python的风格吗?如果有疑问,可以在这里问大家。我认为你会发现,有些复杂性其实是因为C/C++的影响。
无论你做什么,绝对不要使用匈牙利命名法!这会让你的思维变得混乱。
那么,你该怎么做呢?Python和C/C++是完全不同的。在C++中,处理多态调用通常是这样:
void doWithFooThing(FooThing *foo) {
foo->bar();
}
C++中的动态多态依赖于继承:传递给doWithFooThing的指针只能指向FooThing或其子类的实例。而在Python中就不是这样:
def do_with_fooish(fooish):
fooish.bar()
在这里,任何足够“fooish”的东西(也就是说,任何有可调用的bar属性的东西)都可以使用,无论它与其他“fooish”东西通过继承有什么关系。
关键在于,在C++中,你知道每个对象的(基)类型是什么,而在Python中你不知道,也不在乎。你在Python中想要实现的是代码能够在尽可能多的情况下重用,而不需要把所有东西都强行放在严格的类继承规则下。你的命名也应该反映这一点。你不会写:
def some_action(a_list):
...
而是写:
def some_action(seq):
...
这里的seq不仅可以是一个列表,还可以是任何可迭代的序列,比如列表、元组、字典、集合、迭代器等等。
总的来说,你应该更关注代码的意图,而不是它的类型结构。与其写:
dict_of_strings_to_dates = {}
不如写:
users_birthdays = {}
保持函数简短是很有帮助的,尤其是比C/C++更重要。这样你就能更容易地看清楚发生了什么。
还有一点:你不应该把Python的变量看作是指向内存的指针。它们实际上是字典中的条目:
assert foo.bar == getattr(foo, 'bar') == foo.__dict__['bar']
我同意这并不总是完全如此,但具体细节可以在docs.python.org上查到。
顺便说一下,在Python中你并不需要像在C/C++中那样声明东西。你只需定义东西。
如果你在你的类里面使用了文档字符串,那么你可以用help(vargoeshere)
这个命令来查看怎么使用它。