Как проверить, является ли объект разборчивым

У меня есть список объектов разных типов, которые я хочу рассолить. Я хотел бы рассолить только те, которые разборчивы. Существует ли стандартный способ проверить, является ли объект разборным типом, отличным от того, чтобы попытаться рассолить его?

В документации говорится, что если возникает исключение травления, это может быть уже после того, как некоторые из байтов были записаны в файл, поэтому попытка рассортировать объекты в качестве теста не кажется хорошим решением.

Я видел этот пост, но он не отвечает на мой вопрос.

2 Solutions collect form web for “Как проверить, является ли объект разборчивым”

В этом случае я предлагаю утиное тестирование. Попытайтесь рассортировать временный файл или файл памяти, как вам удобно, тогда, если он не удалит результат, если он переименует его.

Зачем?

В python вы можете проверить, имеет ли объект некоторые свойства двумя способами.

Проверьте, является ли объект экземпляром некоторого абстрактного базового класса . Например, Number «Корень из числовой иерархии. Если вы просто хотите проверить, является ли аргумент x числом, не заботясь о том, какой тип, используйте isinstance (x, Number)».

Или попробуйте, а затем обработайте исключения. Это происходит во многих случаях. Пифоническая философия основана на утке . Ключевыми словами являются Duck typing , duck test и EAFP .

Я даже верю, что 1-й был правильно введен с python3 под давлением со стороны сообщества, в то время как многие по-прежнему считают, что утка – это способ пойти с питоном.

AFAIK нет особых предварительных условий, которые можно проверить, ни ABC что объект может быть проверен в случае травления. Итак, все, что осталось, – утка .

Возможно, что-то еще можно попытаться, но, вероятно, это не стоит того. Было бы очень сложно выполнить ручную интроспекцию объекта, чтобы узнать заранее, подходит ли он для травления.

В dill.pickles метод dill.pickles который делает именно это.

 >>> class Foo(object): ... x = iter([1,2,3]) ... >>> f = Foo() >>> >>> dill.pickles(f) False 

Мы можем использовать методы dill чтобы найти причину сбоя.

 >>> dill.detect.badtypes(f) <class '__main__.Foo'> >>> dill.detect.badtypes(f, depth=1) {'__setattr__': <type 'method-wrapper'>, '__reduce_ex__': <type 'builtin_function_or_method'>, '__reduce__': <type 'builtin_function_or_method'>, '__str__': <type 'method-wrapper'>, '__format__': <type 'builtin_function_or_method'>, '__getattribute__': <type 'method-wrapper'>, '__class__': <type 'type'>, '__delattr__': <type 'method-wrapper'>, '__subclasshook__': <type 'builtin_function_or_method'>, '__repr__': <type 'method-wrapper'>, '__hash__': <type 'method-wrapper'>, 'x': <type 'listiterator'>, '__sizeof__': <type 'builtin_function_or_method'>, '__init__': <type 'method-wrapper'>} >>> dill.detect.badtypes(f, depth=1).keys() ['__setattr__', '__reduce_ex__', '__reduce__', '__str__', '__format__', '__getattribute__', '__class__', '__delattr__', '__subclasshook__', '__repr__', '__hash__', 'x', '__sizeof__', '__init__'] 

Итак, единственное, что терпит неудачу, это не «встроенный» метод класса x … так что это хорошее место для начала. Давайте проверим «x», а затем заменим его чем-то другим, если это проблема.

 >>> dill.pickles(Foo.x) False >>> Foo.x = xrange(1,4) >>> dill.pickles(Foo.x) True 

Да, x вызвал сбой и заменил его работой xrange потому что dill может рассортировать xrange . Что делать?

 >>> dill.detect.badtypes(f, depth=1).keys() [] >>> dill.detect.badtypes(f, depth=1) {} >>> dill.pickles(f) True >>> 

По-видимому (вероятно, потому что ссылки на x в классе __dict__ теперь __dict__ ), f теперь маринования … так что мы закончили.

dill также обеспечивает trace показывающую точный путь при травлении объекта.

 >>> dill.detect.trace(True) >>> dill.pickles(f) T2: <class '__main__.Foo'> F2: <function _create_type at 0x10e79b668> T1: <type 'type'> F2: <function _load_type at 0x10e79b5f0> T1: <type 'object'> D2: <dict object at 0x10e7c6168> Si: xrange(1, 4) F2: <function _eval_repr at 0x10e79bcf8> D2: <dict object at 0x10e7c6280> True 
  • Солить обе переменные класса и переменные экземпляра?
  • Исключить поле объекта из травления в python
  • Python: pickle.loads не удалось выполнить экземпляр класса
  • скрипт python для сортировки всей среды
  • ошибка загрузки сокета "__init __ () принимает ровно 2 аргумента (1 задано)"
  • Python __reduce __ / copy_reg семантический и statefull unpickler
  • Есть ли способ просмотреть содержимое cPickle или Pickle без загрузки Python в Windows?
  • Почему не добавляются бинарные соленые огурцы?
  • Почему возникает неожиданное поведение на Python после травления?
  • Попытка написать объект cPickle, но получить ошибку типа атрибута write
  • Как «остановить» и «возобновить» длительный сценарий Python?
  • Python - лучший язык программирования в мире.