Мне нужно проверить, являются ли объекты, считанные из файла (и eval
ed) с ConfigParser
, являются сопоставлениями.Как проверить, является ли объект сопоставлением (поддерживает использование ** O)
Не совсем уверен в терминологии здесь, но позвольте мне объяснить. Учитывая, что мой объект называется O
он должен поддерживать используется следующим образом:
def tester(**kwargs):
print kwargs
tester(**O)
Если O
не поддерживая ** это привело бы в TypeError, например, TypeError: test() argument after ** must be a mapping, not tuple
.
Это очень простой сценарий, но мне нужно знать, что O
будет работать, прежде чем использовать его, и я должен быть абсолютно уверен, что он не подведет. Если бы я испытывал O
за то, что итератор, я хотел бы использовать что-то вроде:
try:
iter(O)
except:
O = tuple()
Как обсуждалось в In Python, how do I determine if an object is iterable?
Я не могу найти параллель отображений. Как обсуждалось в том же ответе выше, использование isinstance
и collections
не является хорошим решением.
Так что я должен сделать мой тестер-функцию выше (без печати) в качестве собственного отображения-тест при загрузке объектов, как
try:
tester(**O)
except TypeError:
O = {}
или же питон имеет встроенный способ проверить это, как есть ли итераторы? Кажется, должно быть одно.
Редактировать
На самом деле связанный ответ выше никогда не выступал против метода isinstance, следует читать его лучше ...
Но это должно быть получено из Mapping или что-то, что является сопоставлением, так это то же самое, что и поддержка **? – deinonychusaur
@deinonychusaur: Нет, 'Mapping' - это ABC, абстрактный базовый класс, и любой объект, поддерживающий * методы *, считается экземпляром. На самом деле это не нужно наследовать от «Mapping», реализация функциональности достаточно. –
OK спасибо за быстрый ответ, я был только смущен, похоже, но концепция отображения python кажется не такой, как здесь, на SO, надеюсь, это поможет кому-то еще. – deinonychusaur