Python 导入 - 解释

标签 python python-3.x import

类似问题:Understanding A Chain of Imports in Python

注意:我使用的是 Python 3.3 我已经在同一目录中设置了以下两个文件来向自己解释导入,但是我仍然不明白它到底在做什么。我理解函数和类定义是需要运行的语句。

无标题.py:

import string

class testing:
    def func(self):
        try:
            print(string.ascii_lowercase)
        except:
            print('not imported')
class second:
    x=1
print('print statement in untitled executed')

东西.py:

from untitled import testing

try:
    t=testing()
    t.func()
except NameError:
    print('testing not imported')

try:
    print(string.ascii_uppercase)
except NameError:
    print('string not imported')

try:
    print(untitled.string.ascii_uppercase)
except NameError:
    print('string not imported in untitled')

try:
    s=second()
    print(s.x)
except NameError:
    print('second not imported')

这是我运行 stuff.py 得到的输出:

print statement in untitled executed
abcdefghijklmnopqrstuvwxyz
string not imported
string not imported in untitled
second not imported

尽管 stuff.py 中的导入仅指定了测试类,但 untitled.py 中的 print 语句仍会执行。此外,string 模块在 stuff.py 中的关系是什么,因为它可以从测试类内部调用,但不能从外部调用。

有人可以向我解释一下这种行为吗,“from import”语句到底是做什么的(它运行什么)?

最佳答案

您可以将 python 模块视为命名空间。请记住,进口不包括:

  • 模块仅导入一次
  • 第一次执行顶层代码
  • 任何导入、变量、函数或类声明仅影响模块本地命名空间

假设您有一个名为 foo.py 的模块:

import eggs

bar = "Lets drink, it's a bar'

因此,当您在另一个模块中执行 from foo import bar 时,您将使 bar 在当前命名空间中可用。如果您执行 import foo,模块 eggs 将在 foo.eggs 下可用。如果您执行 from foo import *,则 egsbar 以及模块命名空间中的其他所有内容也将位于当前命名空间中 - 但是永远不要这样做,通配符导入在 Python 中是不受欢迎的。

如果您执行import foo,然后import Eggs,则eggs处的顶级代码将被执行一次,并且模块命名空间将被执行。存储在模块缓存中:如果另一个模块导入它,则将从该缓存中提取信息。如果您要使用它,则导入它 - 无需担心多次导入多次执行顶级代码。

Python 程序员非常喜欢命名空间;如果可能的话,我总是尝试使用 import foo 然后使用 foo.bar 而不是 from foo import bar - 它保持命名空间干净并防止名称冲突。

也就是说,导入机制是可修改的,即使文件不是 python,您也可以使 python import 语句起作用。

关于Python 导入 - 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952111/

相关文章:

python - 根据单独列中的值替换列的值

c# - Python 中 C# 的 GetEncoding ("28591") 相当于什么?

reactjs - 在 React/Webpack 应用程序中将节点模块导入到 Web Worker

Python - 将宽字符字符串从二进制文件转换为 Python unicode 字符串

python-3.x - Pandas数据框按ID合并文本行组

python - 将标签与过滤器结合起来

python - 导入单个 csv 文件,其中一个数据字段将转到单独的表

eclipse - 找不到LibGDX + Gradle + Maven对Tween Engine的引用

python - python中的二叉搜索树递归实现

python - 导入错误: No module named pdfkit