首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python + Kivy:时钟不适用于部分(关键字)

Python + Kivy:时钟不适用于部分(关键字)
EN

Stack Overflow用户
提问于 2013-04-21 09:51:29
回答 2查看 880关注 0票数 0
代码语言:javascript
复制
def _procedural_reloading(self,gen=[],*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen=gen),.5)

在上面的代码中,_procedural_reloading()是类的一个方法,它得到一个列表,其中包含一些图像并尝试逐一重新加载()它们。你猜怎么着,它不起作用,因为它说_procedural_reloading有多个关键字gen的值!

奇怪的是,如果我将gen作为参数传递(而不是作为关键字参数),那么它工作得很好,这里:

代码语言:javascript
复制
def _procedural_reloading(self,gen=[],*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen),.5)

为什么gen=gen不能工作?

为了更详细地说明,直到现在,我不能传递任何关键字参数与时钟,甚至一次!我总是要一个接一个地安排争论,然后把它们传过去.这是一个众所周知的问题吗?还是我做错什么了?我觉得很蠢!

编辑:

在我的例子中,没有默认值的gen也不使用:

代码语言:javascript
复制
def _procedural_reloading(self,gen,*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen=gen),.5)
EN

回答 2

Stack Overflow用户

发布于 2013-04-21 11:19:13

当你创造

代码语言:javascript
复制
functools.partial(self._procedural_reloading,gen=gen)

partialgen=gen保存到kwargs中。kwargs可能看起来像{'gen': gen},与位置参数无关,还没有给出任何位置参数。当调用此partial函数时,您可以从函数定义中看到:

代码语言:javascript
复制
def _procedural_reloading(self,gen=[],*args):

gen是第一个位置参数,所以现在partial函数的调用者用一定数量的参数调用它,第一个参数被设置为gen!因为这是第一个位置参数,所以您要设置它两次!(这是不允许的)定义这样的位置arg (在它之前有一个默认的arg)是很奇怪和有问题的(可以看到),解决方案是:

代码语言:javascript
复制
def _procedural_reloading(self,*args, **kwargs):

现在您处理的argskwargs不同,您可以像kwargs.get(gen, default)一样获得gen

票数 2
EN

Stack Overflow用户

发布于 2013-04-21 11:29:32

我正在尝试使用@jamylak方法,同时在这里我自己解决这个问题:

正如我所预料的,问题是由于基维的时钟,它似乎把它的参数首先传递给函数!明白了?不是吗?

当时钟调用一个函数时,它会向它传递一个名为dt的参数。

因此,如果您有一个函数,并且想用时钟调用它,那么它至少应该有一个参数:

代码语言:javascript
复制
def clock_callback_function(dt):
    ...

在我的例子中,我总是给我的函数*args,这样Kivy就可以随心所欲地使用它们了!但是,时钟似乎总是覆盖回调函数的第一个参数。为了更好地包装它,我应该编写如下代码:

代码语言:javascript
复制
def _procedural_reloading(self,dt=0,gen=[]):
        if len(gen):
            gen.pop().reload()
            Clock.schedule_interval(functools.partial(
                self._procedural_reloading,gen=gen),.5)

上面的代码毫无例外地工作,但是下面的代码不能工作,我们已经知道:

代码语言:javascript
复制
def _procedural_reloading(self,gen=[],dt=0):
        if len(gen):
            gen.pop().reload()
            Clock.schedule_interval(functools.partial(
                self._procedural_reloading,gen=gen),.5)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16129906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档