0

次のような方法がありました。

def _play(self):
    carda = self._carda
    cardb = self._cardb

    if carda.is_trump and cardb.is_trump:
        winner = self._winbyrank() 
        return winner

    if not carda.is_trump and not cardb.is_trump:
        if carda.suite == cardb.suite:
            winner = self._winbyrank()
            return winner
        else:
            winner = self._winbyfirst()
            return winner

    if carda.is_trump and not cardb.is_trump:
        winner = self._winbytrump()
        return winner
    elif not carda.is_trump and cardb.is_trump:
        winner = self._winbytrump()
        return winner

これは時折(そして私には予想外に)戻ってきNoneました。それを次のように置き換えたところ、問題は解決しました。

def _play(self):
    carda = self._carda
    cardb = self._cardb

    if carda.is_trump and cardb.is_trump:
        winner = self._winbyrank() 

    if not carda.is_trump and not cardb.is_trump:
        if carda.suite == cardb.suite:
            winner = self._winbyrank()
        else:
            winner = self._winbyfirst()

    if carda.is_trump and not cardb.is_trump:
        winner = self._winbytrump()
    elif not carda.is_trump and cardb.is_trump:
        winner = self._winbytrump()

    return winner

これは Python インタープリターのバグではありませんか? メソッドは、最後まで移動して戻るのではなくreturn、値を取得してメソッドを終了するべきではありませんか? 私はPython 2.7.3を使用していますwinnerNone

4

5 に答える 5

4

「関数から値を返すなど、Python の一般的に使用される部分にバグはありますか?」に対する回答です。ほぼ間違いなく「いいえ」です。

最初の関数にはif、明示的な s を回避して、条件が満たされない場合に最後まで到達できるパスがありreturnます。これが発生すると、デフォルトで戻りNoneます。return2 番目のバージョンでは、関数を無条件ステートメントで終了することにより、この問題を回避します。私がお勧めする練習法です。

于 2012-09-08T02:14:12.583 に答える
2

タブとスペースを混ぜてインデントを間違えました。確認するために使用python -ttします。そして、複数の if ステートメントが true になる理由がない限り、ずっと elif に固執してください。

于 2012-09-08T02:09:39.623 に答える
1

if/elifIgnacio Vazquez-Abrams のコメントに加えて、else なしで一種のブロックを使用することも悪い習慣と見なされます。

したがって、次のようなものがある場合:

if spam:
    return eggs

他にもあることを確認してください:

if spam:
    return eggs
else:
    return no_eggs
于 2012-09-08T02:12:26.983 に答える
1

これはリターンの問題に対する答えではありませんNoneが、制御フローを大幅に簡素化できます。

if carda.suite == cardb.suite: #if suites are the same, no need to check trumps
    winner = self._winbyrank()
elif carda.is_trump or cardb.is_trump: #different suites so only one can be trump
    winner = self._winbytrump()
else: #since neither of the above triggered, they are different non-trump suites
    winner = self._winbyfirst()

それ自体で迷路を処理する必要があります(インデントが適切であれば、私には何も見えません。)

Pythonインタープリターよりも、あなたの条件の1つにバグがあったと信じる傾向がはるかに強いです-特にそのような壊滅的なものです! 一般に、このような問題を回避する最善の方法は、制御フローをできるだけ単純かつ明確に保つことです。

于 2012-09-08T02:19:41.377 に答える
0

あなたは、2 つのブール値の 4 つの可能な値をすべてカバーしたため、関数が最後に到達することはないと主張します。

確かに、書いていたら

a = carda.is_trump
b = cardb.is_trump

そして に対してテストするab、これは真になります。ただし、 Python は、ドット表記で属性を要求するたびに属性を再検索します。それだけでなく、属性を検索すると、(プロパティが存在するため) 任意の Python コードの値を返すことができます。したがって、関数を通じて値が一定のままである理由はありません。


簡単な反例:

>>> class Card(object):
...     def __init__(self):
...             self.trump = False
...     
...     @property
...     def is_trump(self):
...             self.trump = not self.trump
...             return self.trump
... 
>>> carda = Card()
>>> carda.is_trump
True
>>> carda.is_trump
False
于 2012-09-08T02:44:01.323 に答える