大多数内置Python类都缺少dict吗?原因是什么?

大多数内置Python类都缺少dict吗?原因是什么?,python,python-3.x,python-internals,Python,Python 3.x,Python Internals,本机Python类(例如os.stat_result)是否如中所建议的那样没有uu dict_u_u属性,这是一个一般规则 内置类(例如os.stat\u result)缺少此功能的技术原因是什么?我不知道是否有正确的答案——原因是,对于大多数对象来说,不需要在实例上附加额外属性就可以快乐地生活,而拥有一个“dict”的成本根本不值得 你能想象一下Python的int是否有dict吗?对于每个数字,除了需要80多个字节外,还需要构建另一个200字节的对象,这样就可以将属性绑定到42 此外,对于可

本机Python类(例如os.stat_result)是否如中所建议的那样没有uu dict_u_u属性,这是一个一般规则


内置类(例如os.stat\u result)缺少此功能的技术原因是什么?

我不知道是否有正确的答案——原因是,对于大多数对象来说,不需要在实例上附加额外属性就可以快乐地生活,而拥有一个“dict”的成本根本不值得

你能想象一下Python的int是否有dict吗?对于每个数字,除了需要80多个字节外,还需要构建另一个200字节的对象,这样就可以将属性绑定到42

此外,对于可imutable类,如元组、字符串等,同一实例可以在不同的上下文中重用—一个实例中的_udict __;可能会使同一对象的看似未连接的实例突然生成属性

另外,您提到的特定类os.stat_result是一个命名的元组,它意味着不可变且紧凑

因此,除了为大多数对象创建dict的大小和资源成本外,还存在编码问题:这些对象通常是本机编码的,即用C编写的,并且必须显式创建dict属性,因此与用Python编写的类不同,必须在这些类中使用dict,而对于Python代码,绕道是避免dict

最后,当开发该语言的社区得出结论认为,拥有dict的对象有任何明显的优势时,它可能会被包括在内。不久前函数对象类型本身就发生了这种情况,现在函数可以通过装饰器将属性附加到它们,这可以很好地使用

如果您需要将额外属性附加到单个类的代码,您可以使用旧的方式来实现,只需继承该类并将对象转换为该类即可。我发现os.stat_result不是命名的_元组,不能用作基类-很抱歉-因此,将其包装在一个简单的类中可能是最简单的操作:

class MyStatResult:
    def __init__(self, stat_result):
         self.stat = stat_result

    def __repr__(self):
         return "Wrapper for" + repr(self.stat)
现在,如果您的目标是将字段标题/值提取为dict,而不是向其添加额外属性-这些对象的可内省部分由dir给出-在os.stat_结果的情况下,重要的字段有一个很好的前缀:

stat = os.stat(path)

stat_dict = lambda path: {name: getattr(stat, field)  for field in dir(stat) if field.startswith("st_")}
在Python 3.8中,多亏了PEP 572,我们将能够将其写成一个漂亮的单行代码:

stat_dict = lambda path: {name: getattr(stat, field)  for field in dir(stat:=os.stat(path)) if field.startswith("st_")}

我不知道是否有一个正确的答案——理由是,对于大多数这些对象来说,人们可以快乐地生活,而无需为它们的实例附加额外的属性——而拥有一个“dict”的成本根本不值得

你能想象一下Python的int是否有dict吗?对于每个数字,除了需要80多个字节外,还需要构建另一个200字节的对象,这样就可以将属性绑定到42

此外,对于可imutable类,如元组、字符串等,同一实例可以在不同的上下文中重用—一个实例中的_udict __;可能会使同一对象的看似未连接的实例突然生成属性

另外,您提到的特定类os.stat_result是一个命名的元组,它意味着不可变且紧凑

因此,除了为大多数对象创建dict的大小和资源成本外,还存在编码问题:这些对象通常是本机编码的,即用C编写的,并且必须显式创建dict属性,因此与用Python编写的类不同,必须在这些类中使用dict,而对于Python代码,绕道是避免dict

最后,当开发该语言的社区得出结论认为,拥有dict的对象有任何明显的优势时,它可能会被包括在内。不久前函数对象类型本身就发生了这种情况,现在函数可以通过装饰器将属性附加到它们,这可以很好地使用

如果您需要将额外属性附加到单个类的代码,您可以使用旧的方式来实现,只需继承该类并将对象转换为该类即可。我发现os.stat_result不是命名的_元组,不能用作基类-很抱歉-因此,将其包装在一个简单的类中可能是最简单的操作:

class MyStatResult:
    def __init__(self, stat_result):
         self.stat = stat_result

    def __repr__(self):
         return "Wrapper for" + repr(self.stat)
现在,如果您的目标是将字段标题/值提取为dict,而不是向其添加额外属性-这些对象的可内省部分由dir给出-在os.stat_结果的情况下,重要的字段有一个很好的前缀:

stat = os.stat(path)

stat_dict = lambda path: {name: getattr(stat, field)  for field in dir(stat) if field.startswith("st_")}
在Python 3.8中,多亏了PEP 572,我们将能够将其写成一个漂亮的单行代码:

stat_dict = lambda path: {name: getattr(stat, field)  for field in dir(stat:=os.stat(path)) if field.startswith("st_")}
即使他们有一个记录,他们的数据也不会在里面。dict中的数据速度非常慢,从C.@user2357112访问起来非常不方便。您认为C和性能原因是什么?我懂吗
d正确的评论作为部分回答,python3本身是从C构建的,这将导致在一些/许多/所有内置类的实例上缺少“dict”?os.stat\u result.“dict”['n\u fields']Out[115]:22在我看来它确实有“dict”属性?“我遗漏了什么吗?”宇宙大学的调查也可能是我遗漏了什么,而你是对的。然而,dict的存在应该如其他问题中所指出的那样,允许json.dumbs的预期行为变成{attr:value,attr2:value2….}难道不是这样吗?根据jonrsharpe的说法,尽管措辞相当不同,但可能是重复的。即使他们有一个u dict,他们的数据也不会在其中。dict中的数据速度非常慢,从C.@user2357112访问起来非常不方便。您认为C和性能原因是什么?我是否正确地理解了这个评论,认为python3本身是从C构建的,这会导致在某些/许多/所有内置类的实例上缺少“dict”?os.stat\u result.“dict”['n\u fields']Out[115]:22在我看来它确实有“dict”属性?“我遗漏了什么吗?”宇宙大学的调查也可能是我遗漏了什么,而你是对的。然而,dict的存在应该如其他问题中所指出的那样,允许json.dumbs的预期行为成为{attr:value,attr2:value2….}难道不是这样吗?根据jonrsharpe的说法,可能是json.dumbs的重复,尽管措辞相当不同