Инструмент для распутывания импорта python и определения функции, из которой вызывается [дубликат]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

25
задан joeforker 3 February 2009 в 19:18
поделиться

4 ответа

Я рекомендую использовать snakefood для создания графических графиков зависимостей проектов Python. Он обнаруживает зависимости достаточно хорошо, чтобы сразу увидеть области для рефакторизации. Его использование довольно просто, если вы читаете немного документации.

Конечно, вы можете опустить шаг создания графа и получить вместо него словарь зависимостей в файле.

25
ответ дан DzinX 4 September 2018 в 07:57
поделиться
  • 1
    Очень интересный материал: я искал быстрый способ определить файлы, используемые данным файлом python, и это было прекрасно: это намного быстрее, чем другие решения, которые я видел (с помощью модуля и т. Д.). Я думаю, когда я получу время, я напишу свое собственное решение на основе АСТ, но теперь это трюк: спасибо! – jkp 28 April 2009 в 20:19
  • 2
    @jkp snakefood - это AST, в чем проблема? – joeforker 15 May 2009 в 03:20
  • 3
    Спасибо за подсказку. Именно то, что мне нужно. Не то, чтобы это было не очень удобно для Windows. Я закончил использовать его в Linux. – lambacck 27 August 2009 в 19:50

Я не уверен в лучшем инструменте, но анализ зависимостей лучше всего делать, используя извлечение и сканирование файлов python проекта.

Вот один из таких инструментов с использованием вышеупомянутой методики: orkohunter.net/depends

0
ответ дан Himanshu Mishra 4 September 2018 в 07:57
поделиться

PyStructure - Автоматическая структура и анализ зависимостей кода Python

Используется для рефакторинга PyDev. http://pystructure.ifs.hsr.ch/trac/

1
ответ дан joeforker 4 September 2018 в 07:57
поделиться
  • 1
    PyStructure включает в себя механизм вывода типа. – joeforker 15 May 2009 в 03:18

Я не знаю, что является лучшим инструментом анализа зависимостей. Вы можете заглянуть в modulefinder - это модуль в стандартной библиотеке, который определяет набор модулей, импортированных скриптом.

Конечно, с python у вас проблемы с условным импортом и даже потенциальными вызовами скриптов __import__, поэтому он может не найти все. Вот почему инструменты, такие как py2exe, нуждаются в особой помощи, чтобы справляться с такими пакетами, как PIL.

1
ответ дан John Fouhy 4 September 2018 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: