如何检查Python类或对象是否是用户定义的(不是内置的)?

问题描述 投票:0回答:2

我需要检查 python 模块来查找简单数据以及“用户定义的对象”。 在这里,我指的是不是内置的、而是使用 class/def 语句定义或动态加载/生成的对象(或函数或类)。

注意也有类似的问题,但他们询问“新样式的用户定义类”。 我看过

inspect
模块 - 我看不出它有什么帮助。

我可以导入模块并“遍历”它,但我不知道将属性标识为简单类型的简单方法。 例如 - 我如何判断 0. 是内置类型?这里:

>>> a=0.
>>> dir(a)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__'...
>>> type(a)
<class 'float'>

我是否必须知道所有标准对象的类才能确定模块/对象的属性是否是“用户定义的”?

python types module
2个回答
7
投票

尝试检查类型模块是否是内置,通常对我有用。

例如:

a = 1.2
type(a).__module__ == "__builtin__"

0
投票

简介

您的问题寻找 2 路选项,而实际上它是 3 路。一个对象可以是:

  • builtin:核心语言的一部分,如
    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

“可管道化”库

两个注意事项:

  1. 我实际上只是编造了“pipable”这个词。这是我的,我要求使用它的信用。
  2. 说真的:那么图书馆的支票在哪里?

据我所知,Python 不会做太多区分你自己的代码和库代码的事情。对于蛇来说,一切都与内置的✕世界有关。

话不多说,这是我的图书馆检查:

is_library = lambda obj: not (is_project(obj) or is_builtin(obj))

图书馆是无人区,所以我测试的是阴性。

© www.soinside.com 2019 - 2024. All rights reserved.