3

私は楽しみのためにPythonImageLibraryプロジェクトに取り組んでいます。ただし、このコードで「listnotcallable」エラーが発生し続ける理由を理解できません。

def __computeTopColors(self):
    temp1, temp2, temp3, temp4 = [], [], [], []

    max = (0,0,0)
    for v in self.PixelVals: 
        if (v[0] > max[0]) and (v[1] > max[1]) and (v[2] > max[2]):
            max = v

    min = (1000,1000,1000)
    for v in self.PixelVals:
        if (v[0] < min[0]) and (v[1] < min[1]) and (v[2] < min[2]):
            min = v

    for pval in self.PixelVals:
        if (min[0] <= pval[0] <= int(((max[0])/2))) and (min[1] <= pval[1] <= int(((max[1])/2))):
            temp1.append(pval) 

    return temp1

def temp(self): 
    print self.temp

注:これは実際にはクラスからの抜粋ですが、特に関連性があるとは思いません。self.PixelVals(R、G、B)の形式のリストタプルです。self.tempは、メソッドのテストに使用している一時的なメソッドです__computeTopColors。self.tempをself.__computeTopColorsinに等しく設定しました__init__

トレースバック:

Traceback (most recent call last):
  File "fiveColors.py", line 39, in <module>
    a.temp()

39行目は私のコードブロックの最後の行です。

4

2 に答える 2

6

You've shadowed int with a list somewhere. Stop doing that. And stop shadowing min() and max() while you're at it.

于 2012-12-19T00:50:19.743 に答える
2

そのコードをファイルに貼り付け、次を追加します。

>>> class Foo(object):
...    pass
>>> a = Foo()
>>> a.PixelVals = [(1,2,3),(4,5,6)]
>>> __computeTopColors(a)
[(1, 2, 3)]

したがって、このコードに問題はありません。

それをスクラッチします—スタイルの問題ありますが、コードを壊すものはありません. 例えば:

  • 組み込み関数の名前と同じminような名前を変数に付けてはいけません。max
  • 読みにくくする以外に機能のない余分な括弧をたくさん入れないでください — <code>int(((max[1])/2)) は明らかに とまったく同じですint(b[1]/2)が、数秒かかり、この方法で何をしているのかを確認するためのちょっとした考え、そしてそれが正しく行われたことを確認するためのさらに長い時間 (これは常に問題ですが、他の人にコードを見て何が考えられるかを推測するように依頼する場合は特にそうです)それを間違える)。
  • PixelValsキャメルケースなどではなく、小文字で変数に名前を付ける必要があります。

明らかに、間違っているのは、あなたが示していないコードの他の部分にあります。

あなたはトレースバックの最後の行を追加し、それは「私のコードブロックの最後の行」からのものだと言いました。最後の行は次のとおりです。

print self.temp

エラーはこれについて不平を言います:

a.temp()

明らかに、あなたが示したコードはあなたが実行しているコードではありません。しかし、私はこれから問題について推測することができます:

それaはおそらく、 を保持するクラス変数またはグローバル変数ですlist。関数として呼び出そうとしています。したがって、Python は、非常に賢明なことに、リスト オブジェクトは呼び出し可能ではないことを示しています。

または、別の推測は次のとおりです。

self.temp を self.__computeTopColors に設定しました

これで、メソッドtempが別の変数に置き換えられます。書かれているように、実際にはメソッドtempをバインドされたメソッドに置き換え__computeTopColorsますが、これはあなたが見ている問題を解決できませんでした(非常に奇妙で悪いことですが)。しかし、これは実際には正しくない可能性があり、実際には、バインドされたメソッドを呼び出した結果にself.tempequal を設定します。これはおそらくリストです。ここで、表示されていない他のコードが を実行してメソッドを呼び出そうとします。メソッドを呼び出し可能なものではなく に置き換えたため、同じエラーが発生します。self.__computeTopColors()tempa.temp()templist

実際、tempメソッドを置き換えなかったとしても、定義どおりに正確には役に立ちません。

def temp(self): 
    print self.temp

これがバインドされたメソッドの実装の表現temp(たとえば、<bound method Foo.temp of <__main__.Foo object at 0x106d0f2d0>>) 以外のものを出力する方法はありません。

それが最初の問題であろうと、2 番目の問題であろうと、まったく別の問題であろうと、これはすべて同じ大きな問題を指しています。さまざまな場所でさまざまなことを意味します。運が良ければ、Python を混乱させてエラーが発生します。運が悪ければ、自分自身とコードの他の読者を混乱させるだけです。

于 2012-12-19T01:09:04.023 に答える