尝试在python中获取对象类型时出错

时间:2017-07-12 14:37:59

标签: python python-2.7 getattr built-in

我有一个主脚本,它导入了我正在编写的另一个python库。 该库包含以下命令:

print getattr(__builtins__, "list")

当我从库中调用它时会产生以下错误:

'dict' object has no attribute 'list'

但是,如果我将相同的命令复制并粘贴到主脚本中,它可以正常工作。任何想法为什么这不起作用?

我的主文件的标题如下所示:

#/usr/bin/env python
from sys import argv
import re, sys, os, argparse
sys.path.extend(map(os.path.abspath, ['C:/Users/xxxx/scripts/modules/']))
import general

我"将军的标题"图书馆是:

#!/usr/bin/env python
from sys import argv
import re, sys, os, argparse

def getBuiltin(name):
    ##Convert a string into an attribute
    try:
        return getattr(__builtins__, name)
    except Exception as e:
        print "Unhandled type in function \"get_builtin\""
        print name
        print e
        exit()

我这样叫图书馆:

print general.getBuiltin("list")

其中," getBuiltin"是我的功能名称

1 个答案:

答案 0 :(得分:1)

您还可以查看此问题:Python: What's the difference between __builtin__ and __builtins__?

正如您在答案中所看到的, builtins 在主模块和另一个模块中有所不同:

  

直接来自python文档:   http://docs.python.org/reference/executionmodel.html

     

默认情况下,在模块中, builtins 是内置的   模块内置(注意:没有'');在任何其他模块中,    builtins 内置模块本身字典的别名。

     

builtins 可以设置为用户创建的字典,以创建一种弱形式的受限执行。

     

CPython实施细节:用户不应触及 builtins ;它   严格来说是一个实现细节。想要覆盖值的用户   在builtins命名空间中应该导入内置(没有'')   模块并适当地修改其属性。一个名称空间   模块在第一次导入模块时自动创建。   请注意,在Python3中,模块 builtin 已重命名为   内置以避免一些混乱。