python模块出现在任何地方
今天,一件奇怪的事情发生在我身上,我想在www.shell.appspot.com上了解一下appengine和Django 当我进来的时候python模块出现在任何地方,python,google-app-engine,Python,Google App Engine,今天,一件奇怪的事情发生在我身上,我想在www.shell.appspot.com上了解一下appengine和Django 当我进来的时候 dir(django) 我收到的订单是 ['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__path__', 'conf', 'core', 'template', 'utils'] ['VERSION', '__builtins__', '__doc__', '__file
dir(django)
我收到的订单是
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__path__', 'conf', 'core', 'template', 'utils']
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__path__', 'conf', 'core', 'forms', 'oldforms', 'template', 'utils']
但我还是努力了
from django import forms
这让我很惊讶,因为在dir()
的o/p上没有这一点。所以出于好奇,我再次输入了dir(django)
我得到的o/p是
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__path__', 'conf', 'core', 'template', 'utils']
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__path__', 'conf', 'core', 'forms', 'oldforms', 'template', 'utils']
注意这里的forms元素。那么有人能向我解释一下这些表单来自何处吗?来自包导入模块的
语句加载(如果它以前没有加载过)package/module.py
(在第一次加载package/\uuu init\uuuuuuu.py
(如果它以前没有加载过它的话)并将'module'
添加为包中的条目(以及当前范围中的变量)。因此,dir(package)
将在导入后显示一个'module'
条目,而不是在导入前
一个包可以包含无限数量的模块和子包(递归),因此在专门导入特定模块和子包之前,加载包中的所有内容(仅填写其dir
!-)将非常缓慢,因此,在第一次导入时,后者的加载是“及时的”(只有到那时,它们才会出现在paren包的dir
).查看表单模块,有大量的“from module import*”语句,在导入过程中处理表单时,这些语句也会将许多属性拉入表单名称空间。为什么这些变量不能递归地包含在当前范围中?导入不应该从上到下加载文件并包含所有属性吗调用导入时的依赖关系?或者依赖关系树是否缓存在其他地方,并动态地包含在\uuuuu dict\uuuuu
中,正如它们被称为的那样?@Evan,“我的属性的属性不是我的属性”--你认为他们为什么会这样?你认为如果任何x
有一个x.y
,它有一个x.y.z
,那么自动x
也必须有x.z
?或者你认为我刚才提到的完全通用的规则对包和/或模块有奇怪的例外吗?它没有-,Python是非常有用的通常情况下,例外情况和特殊情况都是令人厌恶的!如果z
的唯一方法是asx.y.z
(或更深),你就不会在dir(x)
中看到'z'
@Alex也许这不是最好的例子,因为forms是django的子模块,所以您仍然需要包含名称空间来访问其属性(例如forms.x)。如果案例是“from django.forms import*”并且表单模块包含语句“from x import xa,xb,xc”。这是否意味着\uuuu dict\uuuu
应该包含“xa”、“xb”和“xc”?@Evan:ifdjango.forms
包含from x import xa,xb,xc
,并且在您自己的代码中,您可以使用从django.forms import*
,那么是的,您将最终导入xa
、xb
和xc
——除非django.forms
包含一个名为\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
的模块级列表变量,在这种情况下,来自django.forms import*
的将只导入那些名称在中的变量逻辑用例(除去\uu所有问题),'xa'
,'xb'
和'xc'
将位于dir(django.forms)
和导入命名空间中(因此该命名空间中的dir()
将显示它们),但仍然不在dir(django)
中——没有任何东西将它们放在那里。