在python中声明复杂数据结构的类型

时间:2010-12-02 17:11:11

标签: python data-structures types

我对python编程很新(C / C ++背景)。 我正在编写代码,我需要使用复杂的数据结构,如列表字典的字典。 问题是,当我必须使用这些对象时,我几乎不记得它们的结构,以及如何访问它们。 这使得很难恢复处理几天未触及的代码。 一个非常糟糕的解决方案是对每个变量使用注释,但这非常不灵活。 因此,假设python变量只是指向内存的指针,并且它们不能静态地声明类型,那么我是否可以遵循任何约定或规则来简化复杂的数据结构使用?

4 个答案:

答案 0 :(得分:3)

如果您在课程中使用docstrings,则可以使用help(vargoeshere)查看如何使用它。

答案 1 :(得分:2)

无论你做什么,不要,我再说一遍,不要使用匈牙利表示法!它导致严重的大脑和有点腐烂。

那么,你能做什么? Python和C / C ++完全不同。在C ++中,您通常会处理多态调用,如下所示:

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

C ++中的动态多态性依赖于继承:传递给doWithFooThing的指针可能只指向FooThing或其子类之一的实例。在Python中不是这样:

def do_with_fooish(fooish):
    fooish.bar()

在这里,任何足够好的东西(即具有可调用条形属性的所有东西)都可以使用,无论它如何通过继承与任何其他虚构的东西相关联。

这里的要点是,在C ++中你知道每个对象有什么(base-)类型,而在Python中你不知道,而你并不关心。您尝试在Python中实现的代码是可以在尽可能多的情况下重用的代码,而不必在严格的类继承规则下强制执行。你的命名也应该反映出来。你不写:

def some_action(a_list):
    ...

但:

def some_action(seq):
    ...

其中seq可能不仅是一个列表,而是任何可迭代的序列,无论是list,tuple,dict,set,iterator等等。

通常,您强调代码的意图,而不是类型结构。而不是写:

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 ++中那样声明。你只需定义东西。

答案 2 :(得分:1)

我相信你应该好好看看你的一些复杂的结构,你正在用它们做什么,然后问......这是Pythonic吗?在这里询问SO。我想你会发现一些复杂性是C / C ++工件的情况。

答案 3 :(得分:0)

在代码或测试中的某处包含示例。