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
.
Ознакомьтесь с (новыми в 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, поэтому на всякий случай он более гибкий.
используйте isinstance
, в этом нет ничего плохого, и он обычно используется в коде, требующем рекурсии.
Если под словарем вы имеете в виду, что класс объекта наследуется от dict
, isinstance
также вернет True
.
>>> class A(dict):
pass
>>> a = A()
>>> isinstance(a, dict)
True
Утиная печать - это то, где вы делаете то, что хотите, и справляетесь с последствиями, если ваши объекты ведут себя не так, как вы ожидали.
Вы хотите проверить, есть ли что-то похож на dict, и обновите его, если он есть, не так ли? Просто вызовите метод обновления объекта и обработайте исключение, которое вы получите, если такого метода нет.
Конечно, это не удастся, если вы имеете дело с объектами пользовательского класса, у которых есть методы обновления, которые делают что-то совершенно другое - I ' я не совсем понимаю, как с этим бороться.
Ну, чтобы рекурсивно обновить словарь, вы должны вызвать метод 'items' для итерации по нему .
Итак, я предлагаю вам просто сделать:
try :
for key, value in data.items() :
# recursive call
except AttributeError :
# handling the trouble
Если вам также необходимо обрабатывать пользовательские классы, которые ведут себя как словари, но не являются подклассами dict, вы можете использовать getattr для получения требуемой функции.
# loop
# ... more code
someObject = getObject(..)
try:
getattr(someObject, "update")("someValue")
except AttributeError:
# Wasn't a type we can handle