【发布时间】:2017-05-04 22:21:17
【问题描述】:
经过这个question
globals() 给出全局命名空间的字典视图(__main__ 模块)。
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>>
任何新符号(名称),例如添加到此命名空间的operator,都将成为该全局命名空间的成员。
>>> import operator
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'operator': <module 'operator' (built-in)>, '__package__': None}
>>> globals()['operator']
<module 'operator' (built-in)>
>>>
其中operator 是一个新的str 类型键,值是module 类型对象。
进一步在当前命名空间中使用operator 模块(比如__abs__),
>>> globals()['operator']['__abs__']
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
globals()['operator']['__abs__']
TypeError: 'module' object has no attribute '__getitem__'
>>>
它说,operator 模块不是字典,因为没有名称属性 __getitem__。
但是,我的应用程序中的所有代码(在运行时)都将成为 globals() 函数显示的字典的一部分。
问题:
忽略编码标准, 在 JavaScript 中,我可以使用字典符号来编写我的完整代码,例如,
> window['Array']
function Array() { [native code] }
> window['Array']['length']
1
在python中,为什么全局命名空间成员(键)只被视为字典成员而不是它们的值(如operator对象)?尽管您程序的所有后续代码,都是该字典的一部分。
【问题讨论】:
-
我不完全确定我是否理解您的问题。仅仅因为一个模块(实际上是大多数对象)可以使用
vars(module)表示为dict并不意味着模块对象是 一个字典并且应该支持像@987654340 这样的项目访问@。你在问为什么foo.bar和foo['bar']在 Python 中的含义与在 Javascript 中的含义不同? -
@mgilson 在python中,为什么
foo.bar和foo['bar']的意思不一样?尽管所有这些名称都是globals()输出的字典的一部分。 -
在 Javascript 中,对象和字典是一回事,你可以使用
.或[]语法,具体取决于属性是文字还是动态。 Python 有不同的对象和字典(字典是特定类型的对象),属性不同于字典元素。 -
globals()返回一个字典这一事实并不意味着 Python 字典实际上就是所有这些的实现方式。 -
@juanpa.arrivillaga -- 但它是大部分是如何实现的。最值得注意的例外是具有
__slots__和locals()的类。关键区别在于foo.bar通常在foo.__dict__中查找bar键。这允许很多非常酷的东西。例如你可以拥有@property,它在查找时调用一个函数。您可以拥有一个对象,其中foo.get和foo['get']是不同的 事物。它还鼓励结构。foo.bar和foo['bar']已经发展为具有非常清晰且不同的语义。
标签: javascript python dictionary