使函数在第一次调用和后续调用之间表现不同

2024-05-23 19:35:38 发布

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

def download():
    upgrade = True
    if upgrade:
        # do a download using tftp
    else:
        # do a download via HTTP

如您所见,我有一个硬编码值upgrade,它被设置为true。在这个脚本中,它总是执行tftp下载。在

如何更改脚本以在第一次迭代时进行tftp下载,在下一次迭代中调用函数download时,它执行http下载?在


Tags: 脚本truehttp编码ifdownloaddefdo
3条回答

为了完整起见,这里是class解决方案:

class Download(object):
    def __init__(self):
        self.executed = False

    def __call__(self):
        print('http' if self.executed else 'tftp')
        self.executed = True

download = Download()

download()  # tftp
download()  # http
download()  # http

这允许您以非黑客方式跨调用存储状态。在

您可以使用一个闭包,也就是说,有一个返回的内部函数,它保留一个外部状态。假设Python3:

def init_download():
    upgrade = True

    def inner():
        nonlocal upgrade
        if upgrade:
            print('do a download using tftp')
            upgrade = False
        else:
            print('do a download via HTTP')

    return inner

download = init_download()

download()
download()
download()

给出:

^{pr2}$

将代码重新构造如下:

def download(upgrade=True):

  if upgrade:
     do a download using tftp
  else:
     do a download via HTTP

在第二次迭代中,当您调用download时,使用upgrade=False作为参数:

^{pr2}$

相关问题 更多 >