Python中所有的`__builtin__`数据类型列表在哪里?

3

我正在使用类似于以下的比较:

if type( self.__dict__[ key ] ) is str \
    or type( self.__dict__[ key ] ) is set \
    or type( self.__dict__[ key ] ) is dict \
    or type( self.__dict__[ key ] ) is list \
    or type( self.__dict__[ key ] ) is tuple \
    or type( self.__dict__[ key ] ) is int \
    or type( self.__dict__[ key ] ) is float:

我曾经发现,我错过了bool类型:

or type( self.__dict__[ key ] ) is bool \,

好吧- 我想知道还有哪些类型我错过了?

我开始谷歌搜索:

  • diveintopython3:

    Python拥有许多本地数据类型。以下是其中一些重要的:

    1. 布尔值为True或False。
    2. 数字可以是整数(1和2),浮点数(1.1和1.2),分数(1/2和2/3)或甚至复杂数。
    3. 字符串是Unicode字符序列,例如html文档。
    4. 字节和字节数组,例如jpeg图像文件。
    5. 列表是有序的值序列。
    6. 元组是有序的、不可变的值序列。
    7. 集合是无序的值的集合。
    8. 字典是键值对的无序集合。

为什么每个人都在谈论许多类型,但我找不到所有类型的列表?几乎总是只关于重要的


实际类型取决于您正在运行哪个版本的Python。为什么不看一下(Python3)import builtins; vars(builtins) - Anthon
在Python中查看任何名称的内置函数和方法的便捷方式是使用dir。例如:dir(str)dir(list) - Sean Pianka
我认为Python标准库的第四章文档涵盖了所有内置类型。 - Pablo Navarro
1
为什么特别要使用__builtin__中的类型?如果对象是函数或collections.defaultdict,您是否希望输出False - user2357112
1
这似乎是一个XY问题。你为什么想知道所有这些类型?几乎永远不会有一个好的理由去测试一个可以是它们中的任何一个的对象(你应该要么提前了解更多关于你正在测试的对象的信息,要么关心一些其他的标准,比如不是某个特定自定义类的实例)。 - Blckknght
显示剩余2条评论
1个回答

2
您可以迭代 __builtin____dict__,并使用 isinstance 来查看是否为类:
builtins = [e for (name, e) in __builtin__.__dict__.items() if isinstance(e, type) and e is not object]
>>> builtins
[bytearray,
 IndexError,
 SyntaxError,
 unicode,
 UnicodeDecodeError,
 memoryview,
 NameError,
 BytesWarning,
 dict'
 SystemExit
 ...

(请注意,正如@user2357112在优秀的评论中指出的那样,我们明确排除了object,因为它没有用处。)
另外,请注意isinstance可以将元组作为第二个参数,您可以使用它来代替一系列if。因此,您可以这样编写代码:
builtins = tuple([e for (name, e) in __builtin__.__dict__.items() if isinstance(e, type) and not isinstance(object, e)])
>>> isinstance({}, builtin_types)
True

实际上它是__builtins__ - Ryan
@self:不是这样的。__builtins__是一个实现细节,人们滥用它是因为他们不知道应该使用__builtin__。使用__builtins__的代码在放入不同的上下文中时很可能会失败,因为__builtins__突然变成了字典而不是模块,反之亦然。 - user2357112
@AmiTavory: isinstance(anything, builtin_types) 会始终返回 True,因为所有东西都是一个 object - user2357112
@user2357112 非常感谢您的精彩评论!已经进行了更正。 - Ami Tavory
@AmiTavory 在你的编辑之后,你也排除了 type,这是不正确的。更简单和更好的方法是在你的推导式中添加 and e is not object - wim
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接