Обратите внимание на структуру вашей структуры.
type TestController struct {
Account *AccountController
}
Учетная запись является указателем. Он инициализирован в nil
, поэтому, если вы никогда не установите его, чтобы указывать на что-то, он всегда будет равен нулю, и вы получите ошибку разыменования нулевого указателя, когда попытаетесь вызвать для него метод, подобный этому
// c *TestController
c.Account.ActiveAccountID()
Как / когда вы устанавливаете, это зависит от вашего варианта использования.
Также, в зависимости от вашего варианта использования, вы можете изменить его с указателя на встроенную структуру
type TestController struct {
Account AccountController
}
Таким образом, он всегда внутри структуры, но если вы назначите его откуда-то еще, он будет скопирован. В зависимости от вашего варианта использования это может быть нежелательно.
modulefinder может использоваться для получения графа зависимостей.
import
операторы являются в значительной степени всеми зависимостями существует. Существуют, две соответствующих формы для операторов импорта:
import x, y, z
from x import a, b, c
Вам также будет нужно PYTHONPATH
и sites
информация, которая используется для создания sys.path
. Это показывает физические местоположения модулей и пакетов.
Это довольно болезненно для обработки, так как необходимо сделать переходное закрытие всего импорта во всех модулях, которые Вы импортируете.
Как альтернативный подход, можно использовать -v
опция получить полный список импорта и физических файлов. Это производит журнал, который можно отредактировать в плоский список зависимостей.
Например, когда я делаю
>>> import math
Я вижу это в журнале
dlopen("/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/math.so", 2);
import math # dynamically loaded from /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/math.so