Можно ли перезаписать встроенный Python для всего пакета Python? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть пакет Python с десятками подпакетов / модулей. Почти каждый из модулей использует open встроенную функцию Python. Я написал собственную реализацию функции открытия файлов и хотел бы «перенаправить» все вызовы open, которые есть в модулях пакета, на функцию my_open.

Я знаю, что можно написать open = my_open_file в верхней части модуля, чтобы скрыть open внутри модуля, но это будет означать редактирование каждого модуля. В качестве альтернативы, добавьте open = my_open_file в __init__.py пакета и затем выполните from package_name import open, что также подразумевает добавление одной строки кода в каждый модуль.

Можно ли определить функцию my_open_file для области действия пакета только в одном месте? Или добавление одной строки кода в каждый модуль - мой единственный вариант?

1 Ответ

1 голос
/ 26 марта 2019

Подумайте о том, что вы просите сделать с этим модулем: вы написали свой собственный пакет, изменив способ связи встроенной функции.Вы хотите переопределить стандартную языковую функцию.Это нормально ... часть силы языка заключается в способности делать вещи так, как вы определяете.

Проблема возникает, когда вы хотите сделать это по умолчанию , переопределяя этот стандартвозможность для кода, который явно не запросил это изменение.Вы не можете сделать это без каких-либо мощных полномочий.Самый простой способ - это перестроить вашу систему Python из исходных текстов, заменив стандарт open на собственный.

В действительности, «нормальный» способ - это дать каждому из ваших модулей приложения «согласие»., явно заявив, что он хочет использовать новый open вместо того, который определен языком.Это подход, который вы изложили во втором абзаце.Как это проблема для вас?Вставка строки в каждый список параметризованных файлов - это одна системная команда.

...