将类型(a)用作字典键是否合理?

时间:2016-01-27 16:01:29

标签: python dictionary pygments

我正在尝试根据类型将文件存储在字典中。为此,我使用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]

但是,它真的解决了这个问题吗?而且,我开始怀疑在字典中使用类型作为键是足够强​​大的。

那么,是否有更合适,更健壮的方法呢?任何具有良好论据的解决方案都是受欢迎的。

1 个答案:

答案 0 :(得分:3)

使用type()输出,一个对象,作为一个关键就好了。在这种情况下Ignore that warning

我使用dict.setdefault()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()来处理您的用例。它调用给定对象类型的注册函数,取自第一个参数,并支持子类。