How do I call setattr() on the current module?

别等时光非礼了梦想. 提交于 2019-11-26 05:17:14

问题


What do I pass as the first parameter \"object\" to the function setattr(object, name, value), to set variables on the current module?

For example:

setattr(object, \"SOME_CONSTANT\", 42);

giving the same effect as:

SOME_CONSTANT = 42

within the module containing these lines (with the correct object).

I\'m generate several values at the module level dynamically, and as I can\'t define __getattr__ at the module level, this is my fallback.


回答1:


import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

or, without using setattr (which breaks the letter of the question but satisfies the same practical purposes;-):

globals()[name] = value

Note: at module scope, the latter is equivalent to:

vars()[name] = value

which is a bit more concise, but doesn't work from within a function (vars() gives the variables of the scope it's called at: the module's variables when called at global scope, and then it's OK to use it R/W, but the function's variables when called in a function, and then it must be treated as R/O -- the Python online docs can be a bit confusing about this specific distinction).




回答2:


If you must set module scoped variables from within the module, what's wrong with global?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

thus:

>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']



回答3:


In Python 3.7, you will be able to use __getattr__ at the module level (related answer).

Per PEP 562:

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")



回答4:


  1. You wouldn't. You would do globals()["SOME_CONSTANT"] = 42
  2. You wouldn't. You would store dynamically-generated content somewhere other than a module.


来源:https://stackoverflow.com/questions/2933470/how-do-i-call-setattr-on-the-current-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!