Python import globals locals

Что такое параметры `globals` и` locals` в функции Python __import__?

В документации Python есть часть __import__ , которую я не понимаю:

__import__(name[, globals[, locals[, fromlist[, level]]]])

Функция импортирует name модуля, потенциально используя данные globals и locals чтобы определить, как интерпретировать name в контексте пакета. Стандартная реализация не использует свой аргумент locals вообще и использует свои globals только для определения контекста пакета оператора import.

Что нужно для «толкования» имени модуля? Что такое контекст пакета?

Пример вызова с использованием этих параметров выглядит следующим образом:

spam = __import__('spam', globals(), locals(), [], -1) 

Почему этот пример предоставляет функции globals() и locals() для этой функции? Что происходит, когда я предоставляю только globals() ? Или нет?

Вероятно, я пропустил часть логики пространства имен относительно импорта модулей. Не могли бы вы указать мне статью, которая объясняет это / имеет примеры с функцией __import__ ?

Стандартная реализация не использует свой аргумент locals вообще и использует свои globals только для определения контекста пакета оператора import .

Я до сих пор не знаю, как использовать globals ; какая глобальная переменная может повлиять на работу import ?

EDIT: посмотрев на import.c в источнике Python 2.5, я обнаружил, что __import__ ожидает найти либо __name__ либо __path__ в globals , чтобы увеличить путь поиска импорта по пути, найденному в одной из этих переменных, в этом порядке.

globals используется для определения текущего контекста, на котором вызывается импорт. Например:

""" /myproject/a/b.py /myproject/a/foo.py /myproject/c/d.py /myproject/c/foo.py """ # Which foo gets imported? import foo #1 foo = __import__('foo') #2 

Они не совпадают, так как на # 2 нет (простого) способа узнать, из какого модуля вызывается импорт. Функция __import__ должна знать, который является текущим модулем для фактического импорта правильного foo .

Внутренне на __import__() globals используются для получения ссылки на текущий модуль, вызывающий импорт. Из исходного кода __import__ :

Верните пакет, в котором выполняется импорт. Если globals происходит из модуля foo.bar.bat (а не сам пакет), это возвращает запись sys.modules для foo.bar. Если глобальные переменные из init.py пакета, запись пакета в sys.modules возвращается как заимствованная ссылка.

Что нужно для «толкования» имени модуля? Что такое контекст пакета?

Python должен «интерпретировать» это имя. Это глобальный? Это местный?

Теперь x явно локально. a должен быть «интерпретирован». Глобальный? Местный?

Почему этот пример предоставляет функции globals () и locals () для этой функции? Что происходит, когда я предоставляю только глобальные ()? Или нет?

Попробуй и посмотри. Шутки в сторону. С ней легче играть, чем просить.

Важно то, что вы делаете в подсказке >>> глобальны.

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

  • Python argparse: как вставить новую строку в текст справки в подпараллеле?
  • Matplotlib демонстрирует ярлыки x-tick, перекрывающиеся, несмотря на все усилия
  • Python – Как импортировать функции?
  • Как извлечь классы из модулей Python?
  • python __import__ из той же папки не работает
  • Что может привести к тому, что модуль python будет импортирован дважды?
  • Как использовать __init__.py в (под) модули для определения пространств имен?
  • Рассуждение за синтаксисом `from … import …` в Python
  • Импорт модулей Python
  • Python, проверяя, имеет ли модуль определенную функцию
  • Класс импорта Python с тем же именем, что и Directory

Источник

__import__¶

name Required. Name of the module to import. globals Optional. Dictionary of global names used to determine how to interpret the name in a package context. locals Optional. Dictionary of local names names used to determine how to interpret the name in a package context. The standard implementation does not use its locals argument at all, and uses its globals only to determine the package context of the import statement. fromlist Optional. The fromlist gives the names of objects or submodules that should be imported from the module given by name. level Optional. level specifies whether to use absolute or relative imports. The default is -1 which indicates both absolute and relative imports will be attempted. 0 means only perform absolute imports. Positive values for level indicate the number of parent directories to search relative to the directory of the module calling __import__().

Return Value¶

Time Complexity¶

Note¶

This is an advanced function that is not needed in everyday Python programming, unlike importlib.import_module().

Remarks¶

This function is invoked by the import statement. It can be replaced (by importing the __builtin__ module and assigning to __builtin__.__import__) in order to change semantics of the import statement, but nowadays it is usually simpler to use import hooks (see PEP 302). Direct use of __import__() is rare, except in cases where you want to import a module whose name is only known at runtime.

When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned. For example, the statement import spam results in bytecode resembling the following code:

>>> spam = __import__('spam', globals(), locals(), [], -1) 

The statement import spam.ham results in this call:

>>> spam = __import__('spam.ham', globals(), locals(), [], -1) 

Note how __import__() returns the toplevel module here because this is the object that is bound to a name by the import statement.

On the other hand, the statement from spam.ham import eggs, sausage as saus results in

>>> _temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1) >>> eggs = _temp.eggs >>> saus = _temp.sausage 

Here, the spam.ham module is returned from __import__(). From this object, the names to import are retrieved and assigned to their respective names.

If you simply want to import a module (potentially within a package) by name, use importlib.import_module().

Источник

Подробно о locals() и globals() в Python

Метод locals() обновляет и возвращает словарь текущей локальной таблицы символов.

Таблица символов — это структура данных, поддерживаемая компилятором, которая содержит всю необходимую информацию о программе.

К ним относятся имена переменных, методы, классы и т. д.

В основном есть два вида таблиц символов.

В глобальной таблице символов хранится вся информация, относящаяся к глобальной области действия программы, доступ к ней в Python осуществляется с помощью метода globals().

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

Точно так же в локальной таблице символов хранится вся информация, относящаяся к локальной области действия программы, и доступ к ней в Python осуществляется с помощью метода locals().

Локальная область видимости может находиться внутри функции, внутри класса и т. д.

Метод locals() не принимает никаких параметров.

Метод locals() обновляет и возвращает словарь, связанный с текущей локальной таблицей символов.

Как locals() работает в Python?

, '_': '', '__': '', '___': '', '__builtin__': , '__builtins__': , '__name__': '__main__', '_dh': ['/home/repl'], '_i': '', '_i1': 'locals()', '_ih': ['', 'locals()'], '_ii': '', '_iii': '', '_oh': <>, '_sh': , 'exit': , 'get_ipython': >, 'quit': >

Примечание: таблица символов globals() и locals() для глобальной среды одинакова.

Пример как locals() работает внутри локальной области?

def localsNotPresent(): return locals() def localsPresent(): present = True return locals() print('localsNotPresent:', localsNotPresent()) print('localsPresent:', localsPresent())

localsNotPresent: <> localsPresent:

Обновление значений словаря

def localsPresent(): present = True print(present) locals()['present'] = False; print(present) localsPresent()

В отличие от словаря globals(), который отражает изменение фактической глобальной таблицы, словарь locals() не может изменять информацию внутри таблицы locals.

Метод globals() возвращает словарь текущей глобальной таблицы символов.

Словарь таблицы глобальных переменных — это словарь текущего модуля (внутри функции это модуль, в котором он определен, а не модуль, в котором он вызывается).

Метод globals() не принимает никаких параметров и возвращает словарь текущей глобальной таблицы символов.

Как метод globals() работает в Python?

, '_': '', '__': '', '___': '', '__builtin__': , '__builtins__': , '__name__': '__main__', '_dh': ['/home/repl'], '_i': '', '_i1': 'globals()', '_ih': ['', 'globals()'], '_ii': '', '_iii': '', '_oh': <>, '_sh': , 'exit': , 'get_ipython': >, 'quit': >

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

Как изменить глобальную переменную с помощью global()?

age = 23 globals()['age'] = 25 print('The age is:', age)

Здесь, поскольку глобальная таблица символов также хранит все глобальные переменные, т.е. в данном случае age , значение age можно изменить с помощью функции globals(). Доступ к возвращаемому словарю осуществляется с помощью ключа переменной age и изменяется на 25. Это снова отражается в глобальной таблице символов.

Источник

Читайте также:  Python and string comparison
Оцените статью