Python 2中`dir`为何会列出含Unicode名称的属性?
dir()会列出boto3 S3 Client的Unicode属性名? 这事儿得结合Python 2的字符串特性和boto3的底层实现来看,其实很好理解:
Python 2的双字符串体系是根源
Python 2里同时存在str(字节串)和unicode(Unicode字符串)两种独立的字符串类型,这和Python 3把字符串统一为Unicode的设计完全不同。而boto3在Python 2环境下生成客户端属性时,部分内部逻辑会用unicode类型来定义属性名称——哪怕这些名称看起来都是ASCII字符,底层实现也可能统一用Unicode来处理标识符。boto3的动态属性生成机制
boto3的S3客户端不是提前写死的静态类,它是根据AWS服务的API模型(比如JSON格式的接口定义文件)动态生成方法和属性的。在这个动态生成过程中,Python 2版本的boto3会把一部分属性名创建为unicode类型,而不是传统的str字节串。当你用dir()去遍历对象的属性时,它会把所有存在的属性名称(不管是str还是unicode类型)全部列出来,所以分组后会看到两种类型的结果。dir()的行为特性
Python 2的dir()函数会收集对象的所有可访问属性名,包括动态添加的属性。对于那些用Unicode字符串作为名称的属性,dir()不会做类型转换,而是直接返回它们原本的类型,所以你在使用groupby分组时,就会看到<type 'str'>和<type 'unicode'>这两类结果。
举个小例子,你可以试试在Python 2里直接访问Unicode类型的属性名,比如:
# 假设存在u'list_buckets'这个属性名 print(client[u'list_buckets'] is client.list_buckets)
大概率会返回True,因为boto3内部做了兼容,让字节串和Unicode的属性名指向同一个方法,但底层的属性名确实是两种类型并存的。
内容的提问来源于stack exchange,提问作者kojiro

