试图确定两个发电机的相对表现,当我第一次碰见这样的:Python库对全局命名空间有自然依赖吗?
t = timeit.repeat('g.get()', setup='g = my_generator()')
所以我挖成timeit模块,发现设置和声明都拥有自己的私人,最初是空的命名空间,以便评估g的绑定自然不会被g.get()语句访问。显而易见的解决方案是将它们包装到一个类中,从而添加到全局名称空间。
在另一个项目中尝试使用多处理模块在工作人员之间分配任务时,我再次遇到了这个问题。我甚至把每样东西很好地为一类,但不幸的是,呼叫
pool.apply_async(runmc, arg)
失败,并PicklingError因为掩埋工作对象RUNMC实例是(有效)的分配中:
self.predicate = lambda x, y: x > y
所以整个对象不能(理解)酸洗,而:
def foo(x, y):
return x > y
pickle.dumps(foo)
优良,序列
bar = lambda x, y: x > y
从callable(bar)
和type(bar)
产生真,但它是Can't pickle <function <lambda> at 0xb759b764>: it's not found as __main__.<lambda>
。
我只给出了代码片段,因为我可以通过仅将它们拉出到模块或对象级别defs中来轻松修复这些情况。这里的错误似乎是我对通常命名空间使用的语义的理解。如果语言的性质要求我创建更多的def
陈述,我会很乐意这样做;我担心我错过了一个重要的概念。为什么如此强烈地依赖全球命名空间?或者,我不明白的是什么?
Namespaces are one honking great idea -- let's do more of those!
谢谢,它确实是我没有考虑的模块命名空间。从C背景中,在文件范围声明的符号具有外部存储类;这与Python模块是无关的。是的,我的意思是'.next()',但我的打字手指认为他们知道的更好。 – msw 2010-03-29 10:40:03