Загрузка модулей Julia по требованию - PullRequest
2 голосов
/ 05 апреля 2019

У меня очень простой вопрос. Можно ли загружать модули по запросу в Юлии. То есть могут ли модули загружаться тогда, когда они действительно нужны, вместо того, чтобы загружаться во время синтаксического анализа на верхнем уровне.

Сценарий использования, который я имею в виду, состоит в том, что у меня есть некоторый набор кода, который может выполнять некоторые графики с использованием PyPlot, но код далеко не всегда выполняется.

На данный момент это означает, что на верхнем уровне у меня есть оператор типа using PyPlot, который загружается довольно долго.

(Да, я знаю: не следует часто перезагружать Юлию, бла-бла-бла ... но, тем не менее, это вызывает раздражение)

Есть ли способ обеспечить загрузку PyPlot только в том случае, если он действительно необходим? Простейшей идеей было бы включить using PyPlot внутри функции, которая фактически выполняет построение

function my_plot()
    using PyPlot
    plot(1:10,1:10)
end

но это приводит к синтаксической ошибке:

ERROR: syntax: "using" expression not at top level

Итак, есть ли другой способ добиться этого?

1 Ответ

3 голосов
/ 05 апреля 2019

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

Если вы вызываете оператор using в качестве выражения в выражении Julia eval, весь код, выполняемый в выражении «eval» в Julia, автоматически выполняется в глобальной области видимости, даже если синтаксически вызывается значение eval в локальной области действия функции. Так что если вы используете макрос @ eval

function my_plot()
    @eval using PyPlot  # or without the macro, as eval(:(using PyPlot))
    plot(1:10,1:10)
end

это действует так, как если бы PyPlot использовался вне функции, и таким образом избегает синтаксической ошибки.

...