使用 type(a) 作为字典键是否合理?
Is it reasonable to use type(a) as a dictionary key?
我正在尝试根据文件类型将文件存储在字典中。为此,我使用 pygments
API 如下:
# Initialization of the self.files dictionary
self.files = dict()
# Scanning and categorizing the files
for file in files:
lexer = guess_lexer__for_filename(file, None)
if type(lexer) in self.files:
self.files[type(lexer)].append(file)
else:
self.files[type(lexer)] = [file]
但是,现在,当通过 pylint3
传递此代码时,我收到一条警告,告诉我应该使用 isinstance()
代替 type()
(unidiomatic-typecheck)。
目前我发现的解决此警告的最佳方法如下:
self.files = dict()
for file in files:
lexer = guess_lexer__for_filename(file, None)
if lexer.__class__ in self.files:
self.files[lexer.__class__].append(file)
else:
self.files[lexer.__class__] = [file]
但是,真的能解决问题吗?而且,此外,我开始怀疑在字典中使用类型作为键是否足够健壮。
那么,有没有更合适更稳健的做法呢?欢迎任何具有良好论据的解决方案。
使用type()
输出,一个对象,作为一个键就可以了。 在这种情况下。
我会使用 dict.setdefault()
or collections.defaultdict()
来扩展列表值:
self.files = {}
for file in files:
lexer = guess_lexer__for_filename(file, None)
self.files.setdefault(type(lexer), []).append(file)
或
from collections import defaultdict
self.files = defaultdict(list)
for file in files:
lexer = guess_lexer__for_filename(file, None)
self.files[type(lexer)].append(file)
但是,在 Python 3 上,您可以调查是否可以使用 functools.singledispatch()
来处理您的 use-case。它为从第一个参数获取的给定对象类型调用注册函数,并支持子类。
我正在尝试根据文件类型将文件存储在字典中。为此,我使用 pygments
API 如下:
# Initialization of the self.files dictionary
self.files = dict()
# Scanning and categorizing the files
for file in files:
lexer = guess_lexer__for_filename(file, None)
if type(lexer) in self.files:
self.files[type(lexer)].append(file)
else:
self.files[type(lexer)] = [file]
但是,现在,当通过 pylint3
传递此代码时,我收到一条警告,告诉我应该使用 isinstance()
代替 type()
(unidiomatic-typecheck)。
目前我发现的解决此警告的最佳方法如下:
self.files = dict()
for file in files:
lexer = guess_lexer__for_filename(file, None)
if lexer.__class__ in self.files:
self.files[lexer.__class__].append(file)
else:
self.files[lexer.__class__] = [file]
但是,真的能解决问题吗?而且,此外,我开始怀疑在字典中使用类型作为键是否足够健壮。
那么,有没有更合适更稳健的做法呢?欢迎任何具有良好论据的解决方案。
使用type()
输出,一个对象,作为一个键就可以了。
我会使用 dict.setdefault()
or collections.defaultdict()
来扩展列表值:
self.files = {}
for file in files:
lexer = guess_lexer__for_filename(file, None)
self.files.setdefault(type(lexer), []).append(file)
或
from collections import defaultdict
self.files = defaultdict(list)
for file in files:
lexer = guess_lexer__for_filename(file, None)
self.files[type(lexer)].append(file)
但是,在 Python 3 上,您可以调查是否可以使用 functools.singledispatch()
来处理您的 use-case。它为从第一个参数获取的给定对象类型调用注册函数,并支持子类。