2016-05-27 10 views
1

Я попытался выполнить следующий код, но xmlrpclib поднимает исключение:По умолчанию INT значение с XMLRPCLIB

>>> import xmlrpclib 
>>> data = """<?xml version="1.0"?> 
... <methodCall> 
...  <methodName>test_method</methodName> 
...  <params> 
...   <param> 
...    <value> 
...     <int/> 
...    </value> 
...   </param> 
...  </params> 
... </methodCall>""" 
>>> xmlrpclib.loads(data) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 1141, in loads 
    p.feed(data) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 558, in feed 
    self._parser.Parse(data, 0) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 829, in end 
    return f(self, join(self._data, "")) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 864, in end_int 
    self.append(int(data)) 
ValueError: invalid literal for int() with base 10: '' 

Если я заменяю <int/> по <int></int>, ошибка та же; но с <int>0</int> исключение не возбуждается. Те же результаты в python3 с xmlrpc.client.

Я попытался сделать то же самое с PHP, и он работал без каких-либо проблем:

php > $data = '<?xml version="1.0"?><methodCall><methodName>test_method</methodName><params><param><value><int/></value></param></params></methodCall>'; 
php > print_r(xmlrpc_decode($data)); 
Array 
(
    [0] => 0 
) 

documentation от реализации .NET также подразумевает, что <int/> будут переведены на 0:

Если член структуры XML-RPC отсутствует, соответствующий член .NET-структуры будет установлен в значение null вместо значения по умолчанию для типа, если был использован тип с ненулевым значением, например null вместо нуля для целого числа.

Это поведение является ошибкой реализации Python?

+0

Я так думаю. Заполните отчет об ошибке. – pacholik

+0

@pacholik Я задаю вопрос, потому что я нашел не настоящую спецификацию об этом самом предмете на официальном сайте XML-RPC. Может быть, реализация PHP просто работает, потому что разработчики решили добавить этот случай к их реализациям, несмотря на спецификации XML-RPC? – julienc

+0

Вижу. Я все равно все равно заполняю его, если PHP и .NET его поддерживают. – pacholik

ответ

2

Не оценивая реализацию Python :) этот патч обезьяны исправляет то, как end_int() обрабатывает пустые данные. В вашем примере перед вызовом xmlrpclib.loads (данных):

class MyUnmarshaller(xmlrpclib.Unmarshaller): 

    def end_int(self, data): 
     self.append(int(data or "0")) 
     self._value = 0 
    dispatch = xmlrpclib.Unmarshaller.dispatch 
    dispatch["i4"] = end_int 
    dispatch["i8"] = end_int 
    dispatch["int"] = end_int 

xmlrpclib.Unmarshaller = MyUnmarshaller