32

オブジェクトをグローバル名前空間に挿入し、それを変数にバインドする関数を作成することは可能ですか? 例えば:

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

6 に答える 6

21

ただし、グローバルに宣言された関数変数の割り当ては、モジュールの名前空間にのみ挿入されることに注意してください。インポート後にこれらの変数をグローバルに使用することはできません:

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

これらの新しい「モジュールグローバル」もインポートするには、再度インポートする必要があります。ただし、組み込みモジュールは「実際のグローバル」です。

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's 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()
于 2013-01-12T21:15:48.420 に答える
19

はい、globalステートメントを使用してください。

def func():
    global var
    var = "stuff"
于 2012-08-05T01:32:31.567 に答える
3

Roland Puntaierの答えのより簡潔なバージョンは次のとおりです。

import builtins

def insert_into_global_namespace():
    builtins.var = 'an object'
于 2016-10-08T20:24:44.700 に答える
0

名前自体が変数の値であるグローバル変数を作成および設定する方法を誰も説明していないと思います。

これは私が気に入らない答えですが、少なくとも機能します[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']
########################################
  1. Python exec は、多くの理由で避けるべきです。

  2. 注意: 「exec」行に「in」キーワードがないことに注意してください (「unqualified exec」)。

于 2014-08-25T17:25:20.903 に答える