def add_info_extractor(self, ie):
"""Add an InfoExtractor object to the end of the list."""
self._ies.append(ie)
if not isinstance(ie, type):
self._ies_instances[ie.ie_key()] = ie
ie.set_downloader(self)
def get_info_extractor(self, ie_key):
"""
Get an instance of an IE with name ie_key, it will try to get one from
the _ies list, if there's no instance it will create a new one and add
it to the extractor list.
"""
ie = self._ies_instances.get(ie_key)
if ie is None:
ie = get_info_extractor(ie_key)()
self.add_info_extractor(ie)
return ie
Взято из популярного репо python, youtube-dl. В эффекте, чтобы стать лучшим программистом, я кулаком по этому разделу, и мне трудно понять его.Как работает этот конкретный раздел кода?
В частности, последний метод и то, как он не вводит бесконечную рекурсию, если ie_key не найден в списке.
Как и сравнение isinstance в первом методе.
Я понимаю, что нормальная реализация является чем-то вроде: isinstance ('hello', str), но как может type() быть типом? Более того, в чем смысл сравнения типа ie с типом?
Я бы предположил, что _ies_instances является dict, и в какой-то момент сделал что-то вроде 'self._ies_intances [None] = var' – JETM
Он вводит бесконечную рекурсию ... – Bharel