Функция иногда ссылается на локальные переменные и иногда ссылается на глобальные переменные [duplicate]

Используйте секцию сценариев в макете представления и макета.

Поместите все ваши сценарии, определенные в вашем представлении, в разделе «Скрипты» представления. Таким образом, вы можете загрузить основную компоновку после загрузки всех других скриптов. Это настройка по умолчанию при запуске нового веб-проекта MVC5. Не знаю о более ранних версиях.

Просмотры / Foo / MyView.cshtml:

// The rest of your view code above here.

@section Scripts 
{ 
    // Either render the bundle defined with same name in BundleConfig.cs...
    @Scripts.Render("~/bundles/myCustomBundle")

    // ...or hard code the HTML.
    <script src="URL-TO-CUSTOM-JS-FILE"></script>

    <script type="text/javascript">
      $(document).ready(function () {

        // Do your custom javascript for this view here. Will be run after 
        // loading all the other scripts.            
      });
    </script>
}

Просмотры / Shared / _Layout.cshtml

<html>
<body>
    <!-- ... Rest of your layout file here ... -->

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

Обратите внимание, раздел scripts отображается последним в файле основного макета.

3
задан Muhammad Tahir 14 April 2016 в 07:48
поделиться

2 ответа

Сохраните результат вызова locals() (или vars()), чтобы вернуть локальную область функции. В противном случае locals() внутри выражения генератора вернет локальную область gen-expr.

def test3():
    lvar1 = 1
    lvar2 = 2
    lvar3 = 3
    scope = locals()
    myDict = dict((name, eval(name, scope)) for name in [
                  "lvar1", "lvar2", "lvar3"])
    print(myDict["lvar1"])

BTW, создание словаря не требуется:

myDict = locals()  # or vars()
3
ответ дан falsetru 31 August 2018 в 13:26
поделиться

Прежде всего важно прочитать это :

Аргумент выражения анализируется и оценивается как выражение Python (с технической точки зрения, список условий), используя глобалы и локальные словари как глобальное и локальное пространство имен. Если словарь globals присутствует и отсутствует ‘__builtins__’, текущие глобальные переменные копируются в глобалы до того, как выражение будет проанализировано. Это означает, что выражение обычно имеет полный доступ к стандартному модулю __builtin__ и распространяются ограниченные среды. Если словарь locals опущен, по умолчанию используется словарь глобалов. Если оба словаря опущены, выражение выполняется в среде, где вызывается eval(). Возвращаемое значение является результатом оцененного выражения `.

. Для начала важно отметить, что выражение генератора имеет свою собственную область действия (истинно также для понимания dict) следовательно, у него есть свой словарь locals().

  1. Это сработало, потому что в глобальной области действия globals() и locals() dict указывает на тот же словарь, поэтому конструктор dict может получить доступ к этим переменным.
  2. Здесь мы снова вызываем eval() без globals() и locals() dict, поэтому он заканчивается использованием глобальной области и собственной локальной области (пустой), и нет такой переменной, доступной в любой из этих областей.
  3. Помните, что генераторы имеют свой собственный масштаб, поэтому вызов locals() здесь практически не имеет значения, это пустой dict.

Решение:

def test1():
   lvar1 = 1
   lvar2 = 2
   lvar3 = 3
   test1_locals = locals()
   myDict = dict((name, eval(name, test1_locals)) for name in ["lvar1",
                                                 "lvar2",
                                                 "lvar3"])
   print myDict
   print(myDict["lvar1"])

Это сработало, потому что мы захватили test1 locals() в переменной, а затем использовали этот словарь внутри понимания словаря, поэтому теперь он имеет доступ к этим переменным.

4
ответ дан Ashwini Chaudhary 31 August 2018 в 13:26
поделиться
Другие вопросы по тегам:

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