Подтвердить что ты не робот

Вставить переменную в глобальное пространство имен из функции?

Можно ли написать функцию, которая вставляет объект в глобальное пространство имен и связывает его с переменной? Например:.

>>> 'var' in dir()
False
>>> def insert_into_global_namespace():
...        var = "an object"
...        inject var
>>> insert_into_global_namespace()
>>> var
"an object"
4b9b3361

Ответ 1

Да, просто используйте оператор global.

def func():
    global var
    var = "stuff"

Ответ 2

Это так же просто, как

globals()['var'] = "an object"

и/или

def insert_into_namespace(name, value, name_space=globals()):
    name_space[name] = value

insert_into_namespace("var", "an object")

Обратите внимание, что globals является встроенным ключевым словом, то есть 'globals' in __builtins__.__dict__ оценивается как True.

Ответ 3

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

from that_module import call_that_function
call_that_function()
print(use_var_declared_global)

и вы получите

NameError: global name 'use_var_declared_global' is not defined

Вам нужно будет снова импортировать, чтобы импортировать также эти новые "глобальные модули". Модуль builtins является "реальным глобальным", хотя:

class global_injector:
    '''Inject into the *real global namespace*, i.e. "builtins" namespace or "__builtin__" for python2.
    Assigning to variables declared global in a function, injects them only into the module global namespace.
    >>> Global= sys.modules['__builtin__'].__dict__
    >>> #would need 
    >>> Global['aname'] = 'avalue'
    >>> #With
    >>> Global = global_injector()
    >>> #one can do
    >>> Global.bname = 'bvalue'
    >>> #reading from it is simply
    >>> bname
    bvalue

    '''
    def __init__(self):
        try:
            self.__dict__['builtin'] = sys.modules['__builtin__'].__dict__
        except KeyError:
            self.__dict__['builtin'] = sys.modules['builtins'].__dict__
    def __setattr__(self,name,value):
        self.builtin[name] = value
Global = global_injector()

Ответ 4

Более тонкая версия этого ответа:

import builtins

def insert_into_global_namespace():
    builtins.var = 'an object'

Ответ 5

Я не думаю, что кто-то объяснил, как создать и установить глобальную переменную, имя которой само является значением переменной.

Здесь ответ мне не нравится, но по крайней мере он работает [1], обычно [2].

Я хочу, чтобы кто-то показал мне лучший способ сделать это. Я нашел несколько вариантов использования, и я действительно использую этот уродливый ответ:

########################################
def insert_into_global_namespace(
    new_global_name,
    new_global_value = None,
):
    executable_string = """
global %s
%s = %r
""" % (
        new_global_name,
        new_global_name, new_global_value,
    )
    exec executable_string  ## suboptimal!

if __name__ == '__main__':
    ## create global variable foo with value 'bar':
    insert_into_global_namespace(
        'foo',
        'bar',
    )
    print globals()[ 'foo']
########################################
  • Во многих случаях следует избегать использования Python exec.

  • N.B.: Обратите внимание на отсутствие ключевого слова "in" в строке "exec" ( "unqualified exec" ).

Ответ 6

var = ""

def insert_global():    
    global var
    var = "saher"

insert_global()
print var