Python и словарь как объект

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")

, С другой стороны, для большего управления Запросом HTTP можно использовать WinHttp.WinHttpRequest.5.1 вместо MSXML2.ServerXMLHTTP .

17
задан David Maust 21 January 2016 в 17:46
поделиться

5 ответов

Ознакомьтесь с (новыми в 3.x) абстрактными базовыми классами (ABC) в модуле коллекций:

http://docs.python.org/3.1/library/collections.html

Я бы подумал о проверке с помощью isinstance на сопоставление, как показано ниже:

>>> import collections
>>> isinstance({},collections.Mapping)
True

Затем, если вы создаете свой собственный dict-подобный класс, создайте коллекции. Сопоставление одной из его баз.

Другой маршрут пытается перехватить любые исключения. для словарных операций, - но с рекурсией, о которой вы говорите, я бы предпочел сначала проверить по базовому типу, чем обрабатывать, выясняя, какой dict, subdict или другой член dict был или не существовал, чтобы вызвать исключение.

Редактирование, чтобы добавить:Преимущество проверки сопоставления ABC вместо проверки dict заключается в том, что один и тот же тест будет работать для dict-подобных классов независимо от того, являются ли они подклассом dict, поэтому на всякий случай он более гибкий.

18
ответ дан 30 November 2019 в 13:21
поделиться

используйте isinstance , в этом нет ничего плохого, и он обычно используется в коде, требующем рекурсии.

Если под словарем вы имеете в виду, что класс объекта наследуется от dict , isinstance также вернет True .

>>> class A(dict):
    pass

>>> a = A()
>>> isinstance(a, dict)
True
3
ответ дан 30 November 2019 в 13:21
поделиться

Утиная печать - это то, где вы делаете то, что хотите, и справляетесь с последствиями, если ваши объекты ведут себя не так, как вы ожидали.

Вы хотите проверить, есть ли что-то похож на dict, и обновите его, если он есть, не так ли? Просто вызовите метод обновления объекта и обработайте исключение, которое вы получите, если такого метода нет.

Конечно, это не удастся, если вы имеете дело с объектами пользовательского класса, у которых есть методы обновления, которые делают что-то совершенно другое - I ' я не совсем понимаю, как с этим бороться.

1
ответ дан 30 November 2019 в 13:21
поделиться

Ну, чтобы рекурсивно обновить словарь, вы должны вызвать метод 'items' для итерации по нему .

Итак, я предлагаю вам просто сделать:

try :
    for key, value in data.items() :
         # recursive call
except AttributeError :
    # handling the trouble
1
ответ дан 30 November 2019 в 13:21
поделиться

Если вам также необходимо обрабатывать пользовательские классы, которые ведут себя как словари, но не являются подклассами dict, вы можете использовать getattr для получения требуемой функции.

# loop
# ... more code
someObject = getObject(..)
try:
    getattr(someObject, "update")("someValue")
except AttributeError:
    # Wasn't a type we can handle
0
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: