脚本名称与导入的模块名称相同
Script name same as imported module name
如果您有这样的脚本:
import requests
requests.get()
并将其命名为 requests.py
您将收到一个属性错误,指出 requests
没有属性 get
因为 Python 指的是脚本名称请求并且名称没有属性 get
.
但是,如果我有这个脚本:
import time
time.sleep()
我命名为time.py
,不会出错。在 Python 2.7.11 和 Python 3.5.3.
上都试过了
为什么同样的规则在这里不适用?
因为time
是内置的,request是站点包:
尝试打印 __file__
属性以查看模块所在的位置:
print(time.__file__)
AttributeError: 'module' object has no attribute '__file__'
你得到了一个错误,但是 requests
你得到了答案
print(requests.__file__)
C:\Python34\lib\site-packages\requests\__init__.py
help(time.__loader__)
给出了另一个提示:
>>> help(time.__loader__)
Help on class BuiltinImporter in module importlib._bootstrap:
class BuiltinImporter(builtins.object)
| Meta path import for built-in modules.
请求:
>>> help(requests.__loader__)
Help on SourceFileLoader in module importlib._bootstrap object:
class SourceFileLoader(FileLoader, SourceLoader)
| Concrete implementation of SourceLoader using the file system.
无论如何,不要将您的模块作为内置模块或库包调用。在这两种情况下你都会遇到问题。
- 以内置命名:如您所见,您不能导入它
- 以网站包命名:您无法将网站导入 package/use 在您的模块中
如果您有这样的脚本:
import requests
requests.get()
并将其命名为 requests.py
您将收到一个属性错误,指出 requests
没有属性 get
因为 Python 指的是脚本名称请求并且名称没有属性 get
.
但是,如果我有这个脚本:
import time
time.sleep()
我命名为time.py
,不会出错。在 Python 2.7.11 和 Python 3.5.3.
为什么同样的规则在这里不适用?
因为time
是内置的,request是站点包:
尝试打印 __file__
属性以查看模块所在的位置:
print(time.__file__)
AttributeError: 'module' object has no attribute '__file__'
你得到了一个错误,但是 requests
你得到了答案
print(requests.__file__)
C:\Python34\lib\site-packages\requests\__init__.py
help(time.__loader__)
给出了另一个提示:
>>> help(time.__loader__)
Help on class BuiltinImporter in module importlib._bootstrap:
class BuiltinImporter(builtins.object)
| Meta path import for built-in modules.
请求:
>>> help(requests.__loader__)
Help on SourceFileLoader in module importlib._bootstrap object:
class SourceFileLoader(FileLoader, SourceLoader)
| Concrete implementation of SourceLoader using the file system.
无论如何,不要将您的模块作为内置模块或库包调用。在这两种情况下你都会遇到问题。
- 以内置命名:如您所见,您不能导入它
- 以网站包命名:您无法将网站导入 package/use 在您的模块中