Макрос @printf выдает ошибки с предопределенной строкой формата - PullRequest
0 голосов
/ 20 сентября 2018

При запуске Julia 1.0.0 макрос @printf кажется неспособным принять либо строку постоянного формата, либо строку переменного формата.Это показано ниже.

julia> using Printf

julia> const fmt = "%10d %6.4f"
"%10d %6.4f"

julia> @printf(fmt, 101, 65.4039)
ERROR: LoadError: ArgumentError: @printf: first or second argument must be a format string

julia> fmt2 = "%10d %6.4f"
"%10d %6.4f"

julia> @printf(fmt2, 101, 65.4039)
ERROR: LoadError: ArgumentError: @printf: first or second argument must be a format string

Я нашел обсуждение для ранней версии Julia (2013), где подобные вещи были запрещены.

Я вижу в документации 1.0.0 для @printf следующий синтаксис:

@printf([io::IOStream], "%Fmt", args...)

Означает ли это, что "@Fmt" должен быть жестко закодирован в @printf параметры при вызове?

Что-нибудь изменилось в связи с использованием строки динамического формата с 2013 года в отношении @printf?

Джулии

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Перемещенный ответ от редактирования к вопросу, Julia Learner :


Получение строки динамического формата с использованием пакета форматирования

Похоже, чтоиспользование @printf не изменилось до версии 1.0.0.

Для всех, кто хочет иметь возможность строки динамического формата, вот что я нашел для Julia 1.0.0 и версии 20.09.2008Форматирование пакета.Из документации

Этот пакет - чистая Джулия.Настройка этого пакета аналогична настройке других пакетов Julia:

Pkg.add («Форматирование»)

Вероятно, вы получите ошибку error при использовании 1.0.0:

julia>  Pkg.add("Formatting")
ERROR: UndefVarError: Pkg not defined

* Решение: Доступ к новому менеджеру пакетов в Julia 1.0.0 с помощью клавиши], см. docs .

Примечание: Следующая команда чувствительна к регистру, add formatting завершится неудачей.

(v1.0) pkg> add Formatting

Теперь ваш первый тест printfmt может завершиться неудачно, как показано ниже:

julia> printfmt("Testing")
ERROR: UndefVarError: STDOUT not defined

Решение: Добавьте стандартный параметр out и заклинание stdout в нижнем регистре:

julia> printfmt(stdout, "Testing")
Testing

Теперь у нас есть возможность динамического форматирования в Julia 1.0.0:

Далее может появиться следующая ошибка:

julia> const fmt = "%10d %6.4"
ERROR: cannot assign variable Formatting.fmt from module Main

Решение: Используйте имя переменной форматирования, которое не конфликтует с пакетом форматирования.Также обратите внимание на использование в этом примере строки формата в стиле Python:

julia> frmt = "{:10d} {:6.4f}"  # Python-style format string
"{:10d} {:6.4f}"

julia> printfmt(stdout, frmt, 10, 65.4039)
        10 65.4039
0 голосов
/ 20 сентября 2018

Насколько я вижу, проверяя реализацию из @printf, это в настоящее время не поддерживается.Обратите внимание, что он проверяет args[1] isa AbstractString, что не соответствует действительности в вашем примере (где typeof(args[1]) == Symbol).

Если вы считаете, что это следует добавить, вы можете отправить запрос на функцию здесь .

ОБНОВЛЕНИЕ:

На самом деле я должен был прочитать проблему с github, которую вы связали.Хотя он все еще не поддерживается так, как вы этого хотите, есть хорошие способы обработки подобных случаев.Как было предложено Стефаном здесь вы можете сделать:

julia> using Printf

julia> const fmt = "%10d %6.4f"
"%10d %6.4f"

julia> @eval myprintf(x,y) = @printf($fmt,x,y)
myprintf (generic function with 1 method)

julia> myprintf(101, 65.4039)
       101 65.4039

Это определяет (эффективную) функцию myprintf, в которую встроена строка формата.

...