Python 2.7 Python:这些代码做什么&引用;模块=类型(系统)";

Python 2.7 Python:这些代码做什么&引用;模块=类型(系统)";,python-2.7,Python 2.7,我在某处看到了一些用于配置的python代码,但我无法理解 代码如下: import sys, os.path Module = type(sys) # What does this line for? modules = {} print dir(Module) def load(fullpath, env={}, module=Module): try: code = open(fullpath).read() except IOError:

我在某处看到了一些用于配置的python代码,但我无法理解

代码如下:

import sys, os.path

Module = type(sys) # What does this line for? 

modules = {}

print dir(Module)

def load(fullpath, env={}, module=Module):
    try:
        code = open(fullpath).read()
    except IOError:
        raise ImportError, 'No module named %s' % fullpath

    filename = os.path.basename(fullpath)

    try:
        return modules[filename]
    except KeyError:
        pass

    #################################### 
    #### Most confused 

    m = module(filename) 
    m.__module_class__ = module
    m.__file__ = fullpath

    m.__dict__.update(env)

    exec compile(code, filename, 'exec') in m.__dict__
    ####################################

    modules[filename] = m

    return m


def unload(m):

    filename = os.path.basename(m.__file__)
    del modules[filename]

    return None


def reload(m):
    fullpath = m.__file__

    try:
        code = open(fullpath).read()
    except IOError:
        raise ImportError, 'No module named %s' % fullpath

    env = m.__dict__
    module_class = m.__module_class__

    filename = os.path.basename(fullpath)
    m = module_class(filename)

    m.__file__ = fullpath
    m.__dict__.update(env)
    m.__module_class__ = module_class

    exec compile(code, filename, 'exec') in m.__dict__
    modules[filename] = m

    return m
  • 我不明白为什么要使模块=类型(sys)
  • var m及其buildin方法做什么,我在哪里可以找到文档
  • 为什么只定义一个dict变量

  • 在行上方的代码中:

    Module = type(sys)
    
    创建module类型的变量。您可以打开解释器并键入以下代码:

    import sys
    Module = type(sys)
    help(Module)
    
    您将看到以下内容:

    模块内置中有关类模块的帮助:

    类模块(对象) |模块(名称[,文档]) |
    |创建模块对象。 |名称必须是字符串;可选的doc参数可以有任何类型。 |
    |此处定义的方法: |
    |delattr(…) |x.delattr('name')del x.name |
    |getattribute(…) |x.getattribute('name')x.name |
    |init(…) |x.init(…)初始化x;有关签名,请参见帮助(键入(x)) |
    |repr(…) |x.repr()repr(x)

    加载方法(您最困惑的地方)基本上是,将文件添加到模块m中,然后在这些模块中编译代码

    我不知道您试图通过使用此代码来实现什么,但是有更简单的方法来动态加载模块。例如: