Twisted + другие сетевые приложения, есть ли универсальное исправление / bandaid? - PullRequest
0 голосов
/ 24 октября 2018

Вопрос

Есть ли лучший способ обработки конфликта Unicode to Bytes с Python 3 при работе в сети.Я пытаюсь избежать перетекания вызовов some_str.encode () и some_str.decode () на пользовательскую часть приложения.Является ли псевдокод ниже жизнеспособным, или он просто создаст больше проблем при попытке решить проблему.

справочная информация о проблеме

Существуют десятки библиотек, которые изначально были написаны на Python2, где BaseStr был asciiоснован.Например, над Twisted была проделана большая работа, чтобы обойти некоторые причуды с Py 2 до 3, но я думаю, что почти все подняли руки с конфликтом строк.

Идея, которую я имею в видуНиже описана реализация и тестирование.

def basestr_decorator(some_callable):
     def _decorator(*args, **kwargs):
         new_args = args[:]
         if "_ignore" in new_args:
             del new_args["_ignore"]
             return some_callable(*args, **new_args)

         new_kwargs = kwargs.copy() #or some proxy perhaps
         for position, value in enumerate(args, 0):
              if value is unicode:
                    new_args[position] = args[position].decode()
         for key_name in new_kwargs.keys():
              if new_args.get(key_name, None_ is unicode:
                    new_args[key_name] = new_args.setattr(key_name, kwargs[key_name].encode()

          retval = some_callable(*args, **kwargs)
          some_log_mechanism(f"TODO - {instance} has a unicode parameter!")
          return retval.decode("utf-8") if retval is bytes else retval
   return _decorator(some_callable)



def safe_guard(instance:object, ignores:set):
    for propname in [x for x in dir(instance) if x[0] != "_"]:
           if getattr(instance, propname, None) is a callable and propname not in ignores:
                setattr(instance, propname, basestr_decorator(getattr(instance, propname)

 #From here I would wrap some specific object instances that come up often as an issue.

Я уже разбудил txzmq и провел несколько проверок различных входных данных, чтобы отследить конфликты Unicode, но ключевое слово "some".

Одна из целей -исправить непроверенную версию моего проекта txWeb (имя, вероятно, нужно изменить, так как уже есть pypi txweb) https://github.com/devdave/txWeb

Конкретный пример проблемы

Unicode exceptionin twisted Это был не мой вопрос, но этот случай поднимется сотни раз и станет временным затратом для более крупного проекта.

Не имеет значения: все синтаксические / магические вещи в этой библиотекевырывается.Это была интересная идея, которая в приложении стала слишком утомительной и запутанной.

...