为什么python不会在启动时自动导入每个模块?

Geo*_*rge 3 python module python-import python-2.7

我正在玩 Python 2.7,每个人都知道在每个程序开始时,您总是必须导入模块。例如:

import random
import time

for x in range(1, 300):
     print random.randint(1,100)
     time.sleep(1)
print "Done!"
Run Code Online (Sandbox Code Playgroud)

无论如何,我在想,为什么我必须手动导入所有模块?为什么 Python 不只是像这样导入它们。

当然,我可以理解为什么它不会像这样导入:

from random import randint
from time import *

for x in range(1, 300):
     print randint(1,100)
     sleep(1)
print "Done!"
Run Code Online (Sandbox Code Playgroud)

由于某些函数名称可能会发生冲突。但是,如果您必须定义函数在开始时的位置,例如random.random.randint(1,100).

现在现代计算机如此强大,自动导入每个模块似乎是合乎逻辑的,而不是浪费代码行和时间,因为必须找到您需要的模块,然后在可以轻松自动化时手动导入它。那么,为什么python不会在启动时自动导入每个模块呢?

编辑:我制作了一个小程序的新版本,它导入了我可以通过运行找到的每个模块:

 import sys
 sys.builtin_module_names
Run Code Online (Sandbox Code Playgroud)

结果如下:

 x = int(1000000)
def test():
    global x
    x -= 1
    print "Iterations Left: ", x
    import __builtin__
    import __main__
    import _ast
    import _bisect
    import _codecs
    import _codecs_cn
    import _codecs_hk
    import _codecs_iso2022
    import _codecs_jp
    import _codecs_kr
    import _codecs_tw
    import _collections
    import _csv
    import _functools
    import _heapq
    import _hotshot
    import _io
    import _json
    import _locale
    import _lsprof
    import _md5
    import _multibytecodec
    import _random
    import _sha
    import _sha256
    import _sha512
    import _sre
    import _struct
    import _subprocess
    import _symtable
    import _warnings
    import _weakref
    import _winreg
    import array
    import audioop
    import binascii
    import cPickle
    import cStringIO
    import cmath
    import datetime
    import errno
    import exceptions
    import future_builtins
    import gc
    import imageop
    import imp
    import itertools
    import marshal
    import math
    import mmap
    import msvcrt
    import nt
    import operator
    import parser
    import signal
    import strop
    import sys
    import thread
    import time
    import xxsubtype
    import zipimport
    import zlib

def start():
    from timeit import Timer
    t = Timer("test()", "from __main__ import test")
    print t.timeit()

start()
Run Code Online (Sandbox Code Playgroud)

kyl*_*e.a 5

因为你不需要所有这些。如果您不需要它们,则加载每个库都没有意义。

编辑: 我将我的 libs 文件夹复制到一个测试目录,并通过向其中添加一个__init__.py文件将其放入一个包中。在这个文件中,我添加了:

import os
import glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py")]
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含以下内容的测试脚本:

from Lib import *
print('Hello')
Run Code Online (Sandbox Code Playgroud)

当我尝试在 shell 中运行它时,它所做的只是打印 Tim Peters 的“Python 之禅”,在我的浏览器中打开这个网络漫画(我绝对没有看到的两件事)并抛出以下错误:

Traceback (most recent call last):
  File "C:\Users\Hannah\Documents\dropBox\Python\test\test.py", line 1, in <module>
    from Lib import *
AttributeError: 'module' object has no attribute 'crypt'
Run Code Online (Sandbox Code Playgroud)

在执行任何这些操作之前需要相当长的时间,大约 10-15 秒