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

2024-06-25 23:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在脚本中有这个代码部分,需要访问脚本中模块外部的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"]

Tags: 模块代码fromself脚本playinitdef
2条回答

我得到了我的答案:不可能实现我最初想要用ansible模块实现的目标:将从模块检索到的变量放入脚本的主块中,因为“play”是直接从ansible run调用的,所以我无法在主块中指定它。 因此,我将返回值从主块推送到模块,然后模块执行任务。 既然skullgoblet1089给了我一个很好的方向,我会把他的答案记下来

按照您在代码段的最后一行格式化print(co_create)的方式,它显示为CallbackModule类定义的最后一行。当类构造函数到达这一点时,它正确地抱怨变量没有定义,因为在您的示例中既没有名为co_create的类级变量,也没有对任何名为co_create的全局变量的引用在模块级可用。您有两个选项:(1.)在定义类之前,在类定义的对等上下文中定义一个模块级变量,称为“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_startaccessco_create中定义的类似,在打印它之前在类级别使用全局关键字。首选选项(1)。您应该尽量避免使用全局关键字,除非您必须这样做,因为它需要模块其余部分的一致性,所以会有更多的全局关键字和更多的出错机会

相关问题 更多 >