-1

とてもそのような問題なので、私はそれを理解することができません。たぶん私はPythonの知識が少なすぎます。

問題は、この関数が1回スムーズに実行された後、別の関数でエラーが発生することです。

機能、その後物事は壊れます:

    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'

setFixedPriorityの前にこれを1回呼び出しているので、sortByPriorityが正常に機能することはわかっていますが、エラーは発生しません。

これを引き起こす原因は何ですか?

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. で1タプルを作成しlistOfJobs[j - 1]ます(それ以外は何も起こりません)
  2. に 1 タプルを割り当てlistOfJobs[j]ますlistOfJobs[j]
  3. アクセスlistOfJobs[j - 1](繰り返しますが、他には何も起こりません)。

あなたがしたいことは、それを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]

それが何が起こるかを本当に明確にするかどうかは私は主張しますが.

最後に、コードを大幅にクリーンアップできます。リストを直接反復することも、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 sort 関数を使用するように書き直す必要があります。2 つのコンパレーターをソートするための任意の関数を与えることができます。書き換えるのではなく、実際にここでやりたいことですsort()

あなたがしていることの 1 つは、繰り返しの最中にリストを並べ替えているということです。これにより、過去に破損などの奇妙な動作が発生しました。これはあなたの用途には問題なく機能するかもしれませんが、リストに必要なものをすべて調整し終えるまで、ソートしないことを検討する必要があります。

最後に、あなたが作成した場所がわかりませんlistofjobst。それはタイプミスですか?

于 2012-11-11T16:27:16.303 に答える