为什么Python不具有静态variables?
有一个问题,如何在python中模拟静态variables 。
另外,在networking上可以find许多不同的解决scheme来创build静态variables。 (虽然我还没有看到一个我喜欢的。)
为什么Python不支持方法中的静态variables? 这是否被认为是unpythonic或与Python的语法有关?
编辑:
我特别询问了为什么devise决定,我没有提供任何代码示例,因为我想避免解释来模拟静态variables。
这个遗漏背后的想法是,静态variables只在两种情况下有用:当你真的应该使用一个类,当你真的应该使用一个生成器。
如果你想把有状态信息附加到一个函数上,你需要的是一个类。 一个简单的class级,也许是一个class级,但是:
def foo(bar): static my_bar # doesn't work if not my_bar: my_bar = bar do_stuff(my_bar) foo(bar) foo() # -- becomes -> class Foo(object): def __init__(self, bar): self.bar = bar def __call__(self): do_stuff(self.bar) foo = Foo(bar) foo() foo()
如果你希望函数的行为在每次被调用的时候改变,你需要的是一个生成器:
def foo(bar): static my_bar # doesn't work if not my_bar: my_bar = bar my_bar = my_bar * 3 % 5 return my_bar foo(bar) foo() # -- becomes -> def foogen(bar): my_bar = bar while True: my_bar = my_bar * 3 % 5 yield my_bar foo = foogen(bar) foo.next() foo.next()
当然,静态variables对于那些不想处理大型结构的小任务的麻烦的快速而又脏的脚本是有用的。 但是在那里,除了global
之外,你并不需要任何东西 – 这可能看起来像是一团糟,但对于小型的一次性脚本来说,这是可以的:
def foo(): global bar do_stuff(bar) foo() foo()
一个类的一个替代是一个函数属性:
def foo(arg): if not hasattr(foo, 'cache'): foo.cache = get_data_dict() return foo.cache[arg]
虽然一个class级可能更干净,但是这个技巧是有用的,而且更好,在我看来,这是一个全球性的。
在Python 3中,我将使用闭包:
def makefoo(): x = 0 def foo(): nonlocal x x += 1 return x return foo foo = makefoo() print(foo()) print(foo())
我认为本地静态variables的大多数用法是模拟生成器,也就是说,有一些函数执行某个进程的某个迭代,返回结果,但是保留后续调用的状态。 Python使用yield
命令处理这个非常优雅,所以看起来没有太多需要静态variables。
这是一个deviseselect。
我假设Guido认为你不需要他们,你永远不需要他们:你总是可以使用一个全局variables,并告诉每个人保持他们的油腻的爪子你的variables;-)
为了caching或记忆的目的,装饰器可以被用作优雅而通用的解决scheme。
答案与为什么没有人使用静态方法(尽pipe它们存在)几乎相同。 你有一个模块级别的命名空间,它的作用与一个类相同。
一个不明智的select:
您也可以使用定义时间评估函数默认值的副作用:
def func(initial=0, my_static=[]) if not my_static: my_static.append(initial) my_static[0] += 1 return my_static[0] print func(0), func(0), func(0)
它真的很丑,很容易颠覆,但工程。 使用global
将比这更干净,伊莫。
从你的评论之一:“我想用它们来caching从磁盘加载的东西,我认为它杂乱的实例less,如果我可以分配给他们的function”
然后,使用caching类作为类或实例属性到其他类。 这样,您可以使用完整的function集而不会混淆其他的东西。 此外,你得到一个可重用的工具。
这表明,在SO上,总是能够说明自己的问题,而不是要求一个特定的,低层次的解决scheme(例如缺less语言function)。 那样的话,在我看来,不是关于模拟“静态”(从古代语言中被弃用的function)的无休止的辩论,而是有人可以早日给你一个很好的答案。