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)
因为你不需要所有这些。如果您不需要它们,则加载每个库都没有意义。
编辑:
我将我的 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 秒
| 归档时间: |
|
| 查看次数: |
3122 次 |
| 最近记录: |