我需要检查 python 模块来查找简单数据以及“用户定义的对象”。 在这里,我指的是不是内置的、而是使用 class/def 语句定义或动态加载/生成的对象(或函数或类)。
注意也有类似的问题,但他们询问“新样式的用户定义类”。 我看过
inspect
模块 - 我看不出它有什么帮助。
我可以导入模块并“遍历”它,但我不知道将属性标识为简单类型的简单方法。 例如 - 我如何判断 0. 是内置类型?这里:
>>> a=0.
>>> dir(a)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__'...
>>> type(a)
<class 'float'>
我是否必须知道所有标准对象的类才能确定模块/对象的属性是否是“用户定义的”?
尝试检查类型模块是否是内置,通常对我有用。
例如:
a = 1.2
type(a).__module__ == "__builtin__"
您的问题寻找 2 路选项,而实际上它是 3 路。一个对象可以是:
str
、int
、set
、tuple
、list
、dict
...;pip
安装的部分内容;__module __
以您的包文件夹名称开头的内容。这是我对内置函数的有限检查:
is_builtin = lambda obj: obj.__class__.__module__.startswith('builtins')
这是有限的,因为它假设您将在对象上使用它,而不是类或模块。您的用户定义模块将始终报告为内置模块,因为它们是
<class 'type'>
的实例。所以,我想你/我应该添加一个检查来检查是否是一种类型并提出一些东西。
这就是我检查一个物体是否是自制的的方法:
is_project = lambda obj: getattr(obj, '__module__', '').startswith('project_folder')
当然,这假设您的项目文件夹名为
project_folder
。
两个注意事项:
据我所知,Python 不会做太多区分你自己的代码和库代码的事情。对于蛇来说,一切都与内置的✕世界有关。
话不多说,这是我的图书馆检查:
is_library = lambda obj: not (is_project(obj) or is_builtin(obj))
图书馆是无人区,所以我测试的是阴性。