Brainf**k
Хтось напевно страшно об’ївся віагри. І тепер намагається любити мені мозги.
Десь всередині цього коду виникає unicode encode error:
def __r_call(self, *args, **kw):
return self.__call(self.__name, args, kw, self.__ns, self.__sa,
self.__hd, self.__ma)
Клас виглядає так:
# To handle attribute wierdness
class __Method:
# Some magic to bind a SOAP method to an RPC server.
# Supports "nested" methods (e.g. examples.getStateName) -- concept
# borrowed from xmlrpc/soaplib -- www.pythonware.com
# Altered (improved?) to let you inline namespaces on a per call
# basis ala SOAP::LITE -- www.soaplite.com
def __init__(self, call, name, ns = None, sa = None, hd = None,
ma = None, config = Config):
self.__call = call
self.__name = name
self.__ns = ns
self.__sa = sa
self.__hd = hd
self.__ma = ma
self.__config = config
return
def __call__(self, *args, **kw):
if self.__name[0] == "_": # typically get or mutate
if self.__name in ["__repr__","__str__"]:
return self.__repr__()
else:
return self.__f_call(*args, **kw)
else:
color_print('we expect exception here:', ostream=sys.stderr) # Це я написав.
return self.__r_call(*args, **kw)
def __getattr__(self, name):
if name == '__del__':
raise AttributeError, name
if self.__name[0] == "_":
# Don't nest method if it is a directive
return self.__class__(self.__call, name, self.__ns,
self.__sa, self.__hd, self.__ma)
return self.__class__(self.__call, "%s.%s" % (self.__name, name),
self.__ns, self.__sa, self.__hd, self.__ma)
def __f_call(self, *args, **kw):
if self.__name == "_ns": self.__ns = args
elif self.__name == "_sa": self.__sa = args
elif self.__name == "_hd": self.__hd = args
elif self.__name == "_ma": self.__ma = args
return self
Решта методі не цікаві. Цікаво що на початку файлу гордо красується коментар з ліцензією в якому є такий рядок:
# Copyright (c) 2003, Pfizer
Взагалі це просто пояснюється. Phizer – фармацевтична компанія. Фармація – суто емпірична наука, яка використовує гори статистики щоб вияснити кореляцію між вмістом певних компонент в своїх таблетках і тиском крові в певних місцях. Улюблена мова статистики – R. Улюблена універсальна мова всього світу – Python. Пфайзеру нащось знадобився інтерфейс між ними, і вони створили RSOAP. SOAPPY видно теж знадобилось поправити.
Але проблема з кодуванням залишається. Хоча напевне суть в тому, що Google рівнем вище написав:
buf = self._buffer_class(
xml_parser=self._config['xml_parser'],
pretty_xml=Utils.BoolTypeConvert(self._config['pretty_xml']))
old_stdout = sys.stdout
sys.stdout = buf
і тепер я мушу друкувати в stderr щоб щось побачити. Піду напевне досліджувати _buffer_class.
Винен тут Google. Ну нащо їм той SOAP? Дому не використовувати простенький JSON в REST? І найголовніше що мені доведеться до кінця року оцим мучитись.



до кінця року не так вже й багато лищилось, значить і мучатись небагато =)
danbst
Грудень 30, 2011 at 14:09
То що я цього року не встигну вияснити, ще не означає що виясню до Різдва. Тут щойно ще зустрів рядочки, від яких в мене просто істерика. Google намагається імпортувати парсер XML:
# Is this running on Google's App Engine? try: import google.appengine from _xmlplus.parsers.expat import ExpatError except: from xml.parsers.expat import ExpatError # Check if PyXML is installed. try: # Is this running on Google's App Engine? try: import google.appengine import _xmlplus except: try: import _xmlplus except: import xml as _xmlplus from xml.dom import minidom # Test whether xml.version_info exists. version = _xmlplus.__dict__.get('version_info') PYXML_LIB = True except (ImportError, AttributeError): # An anti-anti-hack/workaround for users of python2.5 (and up) to convince # Python not to ignore PyXML. We really do want to use _xmlplus here, even # though it is 'too old'. if ((list(map(eval, MIN_PY_VERSION.split('.'))) < list(sys.version_info)[0:3])): # The change to the environment variables is only active during the life of # a process. import os os.environ['PY_USE_XMLPLUS'] = 'YES' PYXML_LIB = True else: PYXML_LIB = False else: if (not version or list(version) < (list(map(eval, MIN_PYXML_VERSION.split('.'))))): PYXML_LIB = False # Check if cElementTree or ElementTree is installed ... try: # ... as a third party. import cElementTree as etree ETREE_LIB = True ETREE_NAME = etree.__name__ ETREE_VERSION = etree.VERSION except (ImportError, AttributeError): try: # ... natively. import xml.etree.cElementTree as etree ETREE_LIB = True ETREE_NAME = etree.__name__ ETREE_VERSION = etree.VERSION except (ImportError, AttributeError): try: # ... as a third party. import elementtree.ElementTree as etree ETREE_LIB = True ETREE_NAME = etree.__name__ ETREE_VERSION = etree.VERSION except (ImportError, AttributeError): try: # ... natively. import xml.etree.ElementTree as etree ETREE_LIB = True ETREE_NAME = etree.__name__ ETREE_VERSION = etree.VERSION except (ImportError, AttributeError): ETREE_LIB = False if not PYXML_LIB and not ETREE_LIB: msg = ('PyXML v%s or ElementTree v%s or newer is required.' % (MIN_PYXML_VERSION, MIN_ETREE_VERSION)) raise MissingPackageError(msg)bunyk
Грудень 30, 2011 at 14:21
anti-anti-hack/workaround б%;№”!
bunyk
Грудень 30, 2011 at 14:32
Ехх, якби я розумів, наскільки серйозні це проблеми, я б також впав у істерику -)
danbst
Грудень 30, 2011 at 15:04
[...] Brainf**k [...]
Про приємне й неприємне в роботі « Блоґ одного кібера
Січень 12, 2012 at 00:34