Где находится расположение класса 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
Другие вопросы по тегам