def _procedural_reloading(self,gen=[],*args):
if len(gen):
gen.pop().reload()
Clock.schedule_interval(functools.partial(
self._procedural_reloading,gen=gen),.5)
在上面的代码中,_proceural_reloading()是一个类的方法,它获得一个包含一些图像的列表,并尝试逐个重新加载()它们。猜猜看,它不起作用,因为它说_proceural_reloading有多个关键字gen的值!
奇怪的是,如果我传递gen作为参数(不是作为关键字参数),它工作得很好,在这里:def _procedural_reloading(self,gen=[],*args):
if len(gen):
gen.pop().reload()
Clock.schedule_interval(functools.partial(
self._procedural_reloading,gen),.5)
为什么gen=gen不工作?
更详细地说,直到现在我都不能用Clock传递任何关键字参数,甚至一次!我总是要一个接一个地按顺序排列参数,然后传递它们……这是已知的问题吗?还是我做错了什么?我觉得自己很蠢!
编辑:gen没有默认值也不在我的情况下工作:
def _procedural_reloading(self,gen,*args):
if len(gen):
gen.pop().reload()
Clock.schedule_interval(functools.partial(
self._procedural_reloading,gen=gen),.5)
创建
functools.partial(self._procedural_reloading,gen=gen)
partial
将gen=gen
保存为kwargs
。kwargs
可能看起来像{'gen': gen}
,与位置参数无关,还没有给出。当这个partial
函数被调用时,您可以通过函数定义看到:
def _procedural_reloading(self,gen=[],*args):
gen
是第一个位置参数,所以现在partial
函数的调用者带着一定数量的参数调用它,其中第一个参数被设置为gen
!因为它是第一个位置参数,所以要设置两次!(这是不允许的)。像这样定义位置参数(前面有一个默认参数)是很奇怪和有问题的(可以看到),解决方案是:
def _procedural_reloading(self,*args, **kwargs):
现在你处理args
不同于kwargs
,你可以得到gen
像kwargs.get(gen, default)
我试图把@jamylak方法的工作,同时这里我自己的解决方案,这个问题:
正如我所预料的那样,问题是由于Kivy的时钟,它似乎首先将它的参数传递给函数!明白了吗?没有?
当时钟调用一个函数时,它传递一个名为dt的参数给它。
所以如果你有一个函数并且想要用Clock来调用它它应该至少有一个参数:
def clock_callback_function(dt):
...
在我的例子中,我总是给我的函数*args,所以Kivy可以用它们做任何它想做的事情!但似乎时钟总是覆盖回调函数的第一个参数。为了更好地包装它,我应该这样写代码:
def _procedural_reloading(self,dt=0,gen=[]):
if len(gen):
gen.pop().reload()
Clock.schedule_interval(functools.partial(
self._procedural_reloading,gen=gen),.5)
上面的代码没有异常,但下面的代码不工作,我们已经知道:
def _procedural_reloading(self,gen=[],dt=0):
if len(gen):
gen.pop().reload()
Clock.schedule_interval(functools.partial(
self._procedural_reloading,gen=gen),.5)