如何访问全局函数中的值?

How to access value in a function as a global?

注意:更新了我原来的问题

我在脚本中有此代码部分,需要访问脚本中模块外的 co_create 值。

from ansible.plugins.callback import CallbackBase

class CallbackModule(CallbackBase):
  CALLBACK_VERSION = 2.0

  def __init__(self):
        super(CallbackModule, self).__init__()

  def v2_playbook_on_play_start(self, play):
        
        self.play = play
        extra_vars = ""
        vm = play.get_variable_manager()
        co_create = vm.extra_vars["co_create"]

您在代码段的最后一行格式化 print(co_create) 的方式,它显示为 CallbackModule 的 class 定义的最后一行。当 class 构造函数到达这一点时,它正确地抱怨变量未定义,因为在您的示例中既没有 class 级别的变量 co_create 也没有对任何全局变量的引用名为 co_create 的变量在模块级别可用。您有两个选择:(1.)在定义 class 之前,在对等上下文中定义一个模块级变量到 class' 定义,称为 'co_create' ,如:

co_create = None

class CallbackModule(CallbackBase):
    ...

if __name__ == '__main__':
    play = ...
    obj = CallbackModule()
    obj.v2_playbook_on_play_start(play)
    print(co_create)  # no longer None

这将成为您想要的全局变量,不需要对您的任何其他代码进行代码更改。 (2.) 类似于您在实例方法中定义的 v2_playbook_on_play_start 访问 co_create 在打印之前使用 class 级别的全局关键字。选项 (1.) 是首选。你应该尽量避免使用 global 关键字,除非你不得不这样做,因为它需要模块其余部分的一致性,因此需要更多的全局关键字和更多的错误机会。

我得到了答案:我最初想用 ansible 模块实现的是不可能的:将从模块检索的变量获取到脚本的主块中,因为 'play' 被直接调用来自 ansible 运行,所以我无法在主块中指定它。 所以我确实做到了将 return 值从主块推送到模块,然后模块改为执行任务。 既然skullgoblet1089给了我一个很好的方向,我会标记他的答案。