-1

这么大的问题,我想不通。也许我的 Python 知识太少了。

问题是,在此函数顺利运行一次后,另一次我在另一个函数中出错。

函数,之后事情会中断:

    def setFixedPriority( self, priority, lister ):
    step = priority / lister . __len__ ( )
    for j in range( 0, lister . __len__( ) ):
        for i in range( 0, self . listOfJobs . __len__ ( ) ) :
            if self . listOfJobs[ i ] . category == lister[ j ]:
                self . listOfJobs[ i ] . priority += priority
            elif self . listOfJobs[ i ] . jobType == lister[ j ]:
                self . listOfJobs[ i ] . priority += priority
            elif self . listOfJobs[ i ] . timeToDo == lister[ j ]:
                self . listOfJobs[ i ] . priority += priority
        priority -= step
            self . sortByPriority( )

出现问题的函数:

    def sortByPriority( self ) :
    tmp = range ( 1, self . listOfJobs . __len__ ( ) + 1 )
    for i in reversed ( tmp ) :
        for j in range ( 1, i ) :
            if self . listOfJobs [ j - 1 ] . priority < self . listOfJobs [ j ] . priority :
                self . listOfJobs [ j - 1 ], 
                self . listOfJobs [ j ] = self . listOfJobst [ j ], 
                self . listOfJobs [ j - 1 ]

调用函数(来自不同的 python 脚本/文件/类):

    self . jobs . setFixedPriority( int( self . settings[ 'Spinbox1' ] ), self . settings[ 'type' ] . split( ":" ) )

我得到的错误是:

    File "data/ToDoListClass.py", line 82, in sortByPriority
    self . listOfJobs [ j ] = self . listOfJobst [ j ], 
    AttributeError: jobList instance has no attribute 'listOfJobst'

我知道 sortByPriority 工作正常,因为我在 setFixedPriority 之前调用过一次,它不会给我错误。

什么可能导致这种情况发生?

4

2 回答 2

4
AttributeError: jobList instance has no attribute 'listOfJobst'

如果你仔细看,你有一个错字。调用该属性listOfJobs时不带尾随t

请注意,虽然这会消除错误,但这可能不会修复该功能:

self . listOfJobs [ j - 1 ], 
self . listOfJobs [ j ] = self . listOfJobs [ j ], 
self . listOfJobs [ j - 1 ]

该构造可能应该交换 listOfJobs[j]listOfJobs[j - 1]. 由于换行符,这将执行以下操作:

  1. 制作一个单元组listOfJobs[j - 1](没有其他事情发生)
  2. listOfJobs[j]用to分配一个单元组listOfJobs[j]
  3. 访问listOfJobs[j - 1](同样,没有其他事情发生)。

你想要做的是将它写在一行中:

self.listOfJobs[j - 1], self.listOfJobs[j] = self.listOfJobs[j], self.listOfJobs[j - 1]

或者,如果您想保留换行符,请使用 Python 的\语法使行继续:

self.listOfJobs[j - 1], \
self.listOfJobs[j] = self.listOfJobs[j], \
self.listOfJobs[j - 1]

尽管我会争辩说这是否真的很清楚会发生什么。

最后,您可以大量清理代码。您可以直接遍历列表,也可以在一个 if 中检查多个条件。最后,Python 的 sort 函数允许你指定一个自定义的比较函数,这样你就不需要实现自己的排序算法,而是可以使用 Python 的实现。总而言之,你可能会得到这样的结果:

def setFixedPriority (self, priority, listers):
    step = priority / len(listers)
    for lister in listers:
        for job in self.listOfJobs:
            if job.category == lister or job.jobType == lister or job.timeToDo == lister:
                job.priority += priority

        priority -= step

    self.listOfJobs.sort(key=lambda x: x.priority)
于 2012-11-11T16:27:29.710 回答
0

一些注释将帮助您编写更多“Pythonic”代码:

  • 你的代码不是很 Pythonic。你不需要在range()这里使用;您可以使用for ... in行数更少且更清晰的结构。但这不是你的主要问题。
  • sortByPriority()应该重写以使用内置的 Python 排序函数;你可以给它一个任意函数来对两个比较器进行排序。这真的是你想要在这里做的,而不是 rewrite sort()

你正在做的一件事让我很生气,那就是你在迭代列表的过程中对列表进行排序。这在过去对我造成了奇怪的行为,包括破损。这可能适合您的使用,但您应该考虑在完成调整列表中所需的所有内容之前不要对其进行排序。

最后,我看不到您在哪里创建listofjobst. 那是错字吗?

于 2012-11-11T16:27:16.303 回答