Юля: читать файл в строку вне локальной области видимости - PullRequest
1 голос
/ 16 июня 2020

Я впервые пишу на Julia, и меня смущает, как работает область видимости переменных, хотя я читал ее в документации.

Я пишу этот простой скрипт для чтения содержимого файла JSON и проанализируйте его в Dict:

import JSON
using ArgParse

s = ArgParseSettings()
@add_arg_table! s begin
    "filename"
        help = "a positional argument"
        arg_type = String
        required = true
end

function main(args)
    jsontxt = ""
    open(args["filename"], "r") do f
        global jsontxt = read(f, String)  # file information to string
        println(jsontxt)
    end
    model_params = JSON.parse(jsontxt)  # parse and transform data
    println(model_params)
end

parsed_args = parse_args(ARGS, s)
main(parsed_args)

Итак, я ожидаю, что переменная jsontxt будет содержать результат read(f, String), когда я передам его в JSON.parse. Однако кажется, что когда я вызываю JSON.parse, jsontxt пуст, как в области действия функции main. Мое ожидание от чтения аналогичного (или мне так казалось) примера чтения файлов заключалось в том, что я бы изменил содержимое jsontxt, если бы определил его как переменную global, чего, похоже, не происходит.

Что есть Я неправильно понял и как исправить?

Пример JSON для запуска скрипта:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 16 июня 2020

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

Введите следующий код go, чтобы понять, что происходит

import JSON
using ArgParse

s = ArgParseSettings()
@add_arg_table! s begin
    "filename"
        help = "a positional argument"
        arg_type = String
        required = true
end

jsontxt = ""

function main(args)
    jsontxt = "{}" # add a `global` here and your code works fine
    open(args["filename"], "r") do f
        global jsontxt = read(f, String)  # remove the `global` here and your code works fine
        println("inner local scope:")
        println(jsontxt)
    end
    model_params = JSON.parse(jsontxt)  # parse and transform data
    println("outer local scope:")
    println(model_params)
end

parsed_args = parse_args(ARGS, s)
main(parsed_args)
println("global scope:")
println(jsontxt)

Он будет выведите что-то вроде

$ julia test.jl test.json
inner local scope:
{
    "foo": "bar"
}
outer local scope:
Dict{String,Any}()
global scope:
{
    "foo": "bar"
}
...