【问题标题】:How to call a function only Once in Python [closed]如何在Python中只调用一次函数[关闭]
【发布时间】:2015-04-21 05:59:58
【问题描述】:

这里我只想在整个程序中调用一次 Web 服务函数。 如何做到这一点有人建议我

import sys,os

def web_service(macid):
        # do something

if "__name__" = "__main__" :
      web_service(macid)

【问题讨论】:

  • "__name__" = "__main__" 将不起作用。你可能想做__name__ == "__main__"。赋值运算符 (=) 与相等运算符 (==) 不同。还要检查__name__,它不是"__name__"
  • @thefourtheye 我想你的意思是__name__ == "__main__"
  • if __name__ == '__main__':
  • @thefourtheye 我只想调用一次网络服务功能。如何实现这一点。你能建议我吗,如果 name == 'main": 我知道
  • 通用解决方案:一旦被调用,将变量设置为true或其他值,立即检查该变量是否为truereturn。或者,您必须提供更多详细信息,说明您想要这样做的原因。

标签: python


【解决方案1】:

这就是我的想法:

i_run_once_has_been_run = False

def i_run_once(macid):
    global i_run_once_has_been_run

    if i_run_once_has_been_run:
        return

    # do something

    i_run_once_has_been_run = True

@Vaulstein 的装饰器功能也可以工作,甚至可能有点 Python 风格 - 但对我来说似乎有点矫枉过正。

【讨论】:

  • 如果你有两个函数只想运行一次怎么办?
  • @PeterWood 那么我猜你会使用两个全局变量。我认为此时装饰器是有意义的,但对于单个函数来说,最好只使用全局布尔值。
  • 你会如何命名另一个全局?
  • 好点 - 请参阅我的编辑。我猜如果i_run_once_also() 在起作用,我们会命名为全局i_run_once_also_has_been_run。但同样,我认为装饰器解决方案在那里更好。
  • 而不是全局,也许使用属性 (i_run_once.has_been_run = True),并使用 getattr(i_run_once, 'has_been_run', False) 进行测试。
【解决方案2】:

使用类,

class CallOnce(object):
    called = False

    def web_service(cls, macid):
        if cls.called:
            print "already called"
            return
        else:
            # do stuff
            print "called once"
            cls.called = True
            return


macid = "123"
call_once_object = CallOnce()
call_once_object.web_service(macid)
call_once_object.web_service(macid)
call_once_object.web_service(macid)

结果是,

I have no name!@sla-334:~/stack_o$ python once.py 
called once
already called
already called

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2021-02-15
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多