代码之家  ›  专栏  ›  技术社区  ›  Phlippie Bosman

将函数局部参数赋给同名全局变量

  •  0
  • Phlippie Bosman  · 技术社区  · 6 年前

    我有一个模块,假设它的结构是:

    algorithms
     ├─ __init__.py
     └─ algorithm.py
    

    在我的算法模块中,我有一些全局变量,我想创建一个方便的初始化器来设置它们。我想对初始化器的参数使用与vars相同的名称,但这会导致本地和全局名称的冲突。我能想到的最干净的实现方法是:

    lower = None
    upper = None
    
    def init_range(lower, upper):
       _lower = lower
       global lower
       lower = _lower
    
       _upper = upper
       global upper
       upper = _upper
    

    如果这是一门课,(我想)我可以做 self.lower = lower . 有没有比我为模块全局变量做的更简单的方法?有点像 algorithm.lower = lower ?

    编辑:结果我的解决方案不起作用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Aran-Fey Swapnil    6 年前

    你可以使用 globals 函数获取表示全局范围的字典,以及 update 它:

    def init_range(lower, upper):
       globals().update(lower=lower, upper=upper)
    
        2
  •  2
  •   timgeb    6 年前

    如果你真的坚持要保留参数名 lower upper (为什么不 new_lower , new_upper 或者类似的事情?)然后,可以将任务委托给具有可选变量名的内部函数。

    def init_range(lower, upper):
        def _init_range(_lower, _upper):
            global lower
            global upper
            lower = _lower
            upper = _upper
    
        _init_range(lower, upper)
    

    演示:

    >>> lower is None, upper is None
    (True, True)
    >>> init_range(lower=1, upper=2)
    >>> lower, upper
    (1, 2)