Как обезопасить одну строку кода в стороннем Python модуле? - PullRequest
1 голос
/ 18 февраля 2020

Ниже приведен фрагмент кода стороннего Python модуля, который я использую в большом проекте.

class LockedStream(object):
    file = None
    def __init__(self, file):
        self.file = file

    def write(self, x):
        with input_lock:
            self.file.write(x)

    def flush(self):
        return getattr(self.file, 'flush', lambda: None)()

original_stdout, original_stderr = sys.stdout, sys.stderr
sys.stdout, sys.stderr = map(LockedStream, (sys.stdout, sys.stderr)) # <- PROBLEM LINE

Выделенная строка заставляет другой модуль создавать sh, потому что изменения, которые он делает, несовместимы с тем, что ожидает другой модуль. Удаление этой строки немедленно решило бы проблему, но будущие обновления модуля отменили бы изменение, и, кроме того, это было хакерское решение. Если бы эта строка была внутри функции / класса, я мог бы обезопасить эту функцию / класс, но мне неясно, как лучше всего избавиться от этой строки. Ниже перечислены возможные подходы к решению этой проблемы, ни один из которых не кажется идеальным.

  1. Удалите эту строку, непосредственно изменив сторонний модуль.
  2. Обезьяна исправит класс LockedStream в таким образом, чтобы он не сломал другой модуль или этот.
  3. Измените порядок импорта, чтобы модуль, который будет поврежден, загружался до того, как произойдет это неприятное изменение.

В настоящее время я использую подход 3, но это вряд ли выглядит элегантным решением. Будем благодарны за любые предложения о том, как поступить. Спасибо за вашу помощь.

...