Сделать импортированные модули приватными для других модулей - PullRequest
0 голосов
/ 30 января 2019

Предположим, у меня есть такой код в модуле a.py

import numpy as np

def sqrt(x):
  return np.sqrt(x)

И у меня есть модуль b.py, написанный так:

import a
print(a.sqrt(25))
print(a.np.sqrt(25))

Я увижу, чтокод работает нормально, и при использовании автозаполнения в большинстве IDE я обнаружил, что a.np доступен.Я хочу сделать a.np приватным, чтобы только a код мог видеть эту переменную.Я не хочу, чтобы b имел доступ к a.np.

Какой хороший подход позволяет сделать это возможным?

Почему я хочу, чтобы a.np был недоступен?Потому что я хочу, чтобы он не отображался в автозаполнении, когда я набираю a. и нажимаю Tab в Jupyter Lab.Он скрывает, что могут делать модули, потому что в моем модуле так много импортов.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Здесь я вижу 2 подхода:

  1. более удобное для пользователя решение: измените имена псевдонимов на "подчеркнутые"

    import numpy as _np
    ...
    

    это не помешает импортуэто, но он скажет пользователю, что это детали реализации, и от них не следует зависеть.

  2. предпочтительное для меня решение: ничего не делать, оставить все как есть, использоватьВерсии semver и bump соответственно.

0 голосов
/ 30 января 2019

Решение такое же, как и для «защищенных» атрибутов / методов в классе (имена, определенные в модуле, фактически - во время выполнения - атрибуты объекта модуля): перед этими именами ставится один начальный знак подчеркивания, т. Е.

import numpy as _np

def sqrt(x):
  return _np.sqrt(x)

Обратите внимание, что это НЕ помешает кому-либо использовать a._np.sqrt(x), но, по крайней мере, дает понять, что он использует защищенный атрибут.

...