Где находится расположение класса Normal в исходном коде Эдварда?
При использовании Эдварда, мы всегда используем from edward.models import Normal
, но я не нашел декларации Normal
в GitHub
Кто-нибудь, кто может сказать мне, где это
1 ответ
Они определены в edward/models/random_variables.py
,
Вы импортируете Normal
класс как это:
from edward.models import Normal
Это предполагает поиск в edward/models/__init__.py
, который имеет эту строку:
from edward.models.random_variables import *
Ищу в edward/models/random_variables.py
мы находим этот код:
from edward.models.random_variable import RandomVariable as _RandomVariable
from tensorflow.contrib import distributions as _distributions
# Automatically generate random variable classes from classes in
# tf.contrib.distributions.
_globals = globals()
for _name in sorted(dir(_distributions)):
_candidate = getattr(_distributions, _name)
if (_inspect.isclass(_candidate) and
_candidate != _distributions.Distribution and
issubclass(_candidate, _distributions.Distribution)):
# to use _candidate's docstring, must write a new __init__ method
def __init__(self, *args, **kwargs):
_RandomVariable.__init__(self, *args, **kwargs)
__init__.__doc__ = _candidate.__init__.__doc__
_params = {'__doc__': _candidate.__doc__,
'__init__': __init__}
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)
del _candidate
Это проходит через tensorflow.contrib.distributions
модуль ищет классы, полученные из tensorflow.contrib.distributions.Distribution
(игнорируя другие атрибуты, такие как, например, __file__
член модуля или базы Distribution
сам класс). Для каждого из них выполняется небольшой взлом (который влияет только на сгенерированную документацию), а затем выполняется эта ключевая строка:
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)
type()
встроенная функция создает новый тип, т.е. объявляет новый класс. Второй параметр - это список базовых классов, который здесь является Эдвардом. RandomVariable
класс и класс случайных величин TensorFlow. Ранее это определило _globals
быть globals()
, которая является встроенной функцией, возвращающей словарь переменных модуля. Поэтому в интересующем вас случае приведенная выше строка эквивалентна следующей:
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
Normal = type("Normal", (EdRandVar, TfNormal), {...})
Что в свою очередь эквивалентно этому (если вы игнорируете материал документации):
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
class Normal(EdRandVar, TfNormal):
pass