Перезаписать библиотеку Python os во всех зависимостях - PullRequest
0 голосов
/ 03 мая 2020

Я использую официальные библиотеки от pypi, которые в значительной степени полагаются на os lib для open, isfile, makedirs и т. Д., Которые ограничены, если вы хотите работать с GCS, S3 или другими облачными хранилищами. Я не хочу связываться с внутренними компонентами официальных библиотек, но у меня есть быстрый патч, который заставит все импортированные библиотеки вернуться к моей реализации. Скажем, os.path.isfile = my_isfile_fun, но только когда path начинается с gs:// или s3://, в противном случае он использует стандартную библиотеку (я не хочу полностью ее ломать). Есть способ сделать это? Кроме того, я не хочу изменять всю библиотеку, а только некоторые функции.

Вот сценарий

import some_pypi_module # <--- it uses os library

some_pypi_module.save(path) # <--- is saves to the path on disk using os library

Мой желаемый сценарий

# do something to patch os
#
import some_pypi_module # <--- it uses modified os library

some_pypi_module.save(path) # <--- is saves to the path on disk using modified os library and now can understand gs://

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы можете выполнить исправление следующими способами:

import os
os.path.isfile_old = os.path.isfile

def my_isfile_fun(path):
    if(path.startswith(('s3://', 'gs://')):
        #use boto3 head object or your logic that you wish to implement
    else:
        return os.path.isfile_old(path)

os.path.isfile = my_isfile_fun

Теперь, когда вы запускаете

os.path.isfile(path)

Будет возвращено значение соответственно

Надеюсь, это поможет

0 голосов
/ 03 мая 2020

Я не уверен, что это хорошая идея, но есть возможность переопределить функции и переменные из импортированных модулей после их импорта. В качестве примера Hree можно использовать numpy:

>>> import numpy as np
>>> np.pi
3.141592653589793
>>> np.pi = 4
>>> np.pi
4
>>> np.sin(0)
0.0
>>> np.sin = lambda x : x+1
>>> np.sin(0)
1

Таким образом, можно принять решение выполнить проверку с помощью оператора if в нужных вам файлах, а затем внести необходимые корректировки.

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

...