【问题标题】:Python - retrieving value from function within another function, while not rerunning the original functionPython - 从另一个函数中的函数检索值,而不是重新运行原始函数
【发布时间】:2015-07-16 14:11:20
【问题描述】:

我正在编写一个程序,每次从一堆词干中对音乐进行不同的排序。我现在有了一个基本的 GUI,其中包含触发轨道重新排序、播放和弹跳的按钮。

因此,在执行时,程序会触发一次重新排序功能,并返回准备好播放的输出值。 这可以使用 play 函数播放,但是要在函数内接收输出,必须重新触发初始函数,这是不对的。

我不想每次用户想要重播曲目时都重新触发排序功能,我只需要访问初始返回数据。我无法将返回的数据分配到重新排序函数之外,因为它只会保存一次,并且只有第一个序列可以播放。

下面的代码示例是我所拥有的,它对我不起作用。

我需要的是一种在每次重新排序时保存变量并使其可供播放功能访问的方法。 Play 不应仅仅为了获取值而重新触发重新排序。

:::

Resequence():

blah blah, sequencing.

return output

播放():

output=Resequence()   # the value shouldnt change on each play. 

play(output)

:::

输出是来自 PyDub 的音频片段。我尝试将其保存在文本文件中,这显然不起作用。

请帮忙:(

【问题讨论】:

  • 所以将output设为全局并在分配之前检查它是否已经包含一个值(或者如果没有办法做到这一点 - 添加一个全局标志来指示它)。
  • 您也许可以使用pickle 模块来保存输出。如果没有,也许pydub 有一些工具可以保存和加载它。
  • 请提供更多代码,以便为您提供具体答案。谢谢。
  • 把你的代码放在一个类中,例如class Player: ... 并使 output 成为实例变量 (-> self.output = ...)。通过try: ... except AttributeError: ...访问它。
  • 在将其设为全局变量之前,请考虑Global Variables Are Bad

标签: python function return pydub


【解决方案1】:

如果 Resequence 是一个函数而不是类方法,那么您可能需要使用全局变量来存储所需的序列。像这样:

seq = None
def Resequence():
    global seq
    if seq != None:
        return seq
    #now do your blah, blah, blah
    seq = my_generated_sequence
    return seq

但是我觉得你需要让 Resequence 成为对象的一部分,以允许每次多次调用不同的文件等。

class Player(object):
     def __init__(self):
         self._seq = None
     def Resequence(self):
        if self._seq != None:
           #same logic here...

【讨论】:

  • 谢谢 Arthur,在这种情况下,我可能会将所有松散的函数转换为一个类。 :)
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2015-08-18
  • 2020-07-12
  • 2015-07-02
  • 1970-01-01
  • 2020-02-13
  • 2020-04-01
相关资源
最近更新 更多