0

たとえば、コードがある場合:

class Example ():

    def a(self):
        return 'Buy'

    def b(self):
        if (self.a() == 'Buy'):
            return 'BUY SET'
        elif (self.a() == 'Sell'):
            return 'SELL SET''

o = Example()
value = o.b()   
print value 

関数 b(self) を記述できる、よりエレガントで Pythonic な方法はありますか?

4

5 に答える 5

14

まず、不要な括弧を取り除きます。コードの構造をたどりにくくするだけです。

def b(self):
    if self.a() == 'Buy':
        return 'BUY SET'
    elif self.a() == 'Sell':
        return 'SELL SET''

'次に、それを発生させる原因となる迷子を取り除きSyntaxErrorます:

def b(self):
    if self.a() == 'Buy':
        return 'BUY SET'
    elif self.a() == 'Sell':
        return 'SELL SET'

次に、二度電話しないでくださいself.a()。ここでは無害ですが、実際のコードでは、副作用が発生する可能性が非常に高く、少なくとも時間を無駄にするほど時間がかかります。

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET'

次に、ora以外を返す場合は、 を返します。それは本当にあなたが望むものですか?これをどのように修正するかは、実際に何を望んでいるかによって異なります。たとえば、次のことが必要な場合があります。'Buy''Sell'None

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET'
    else:
        raise ValueError("Unexpected order type '{}'".format(order))

または多分:

def b(self):
    order = self.a()
    if order == 'Buy':
        return 'BUY SET'
    else: # We know there's nothing else it could be
        return 'SELL SET'

2 つ以上の可能性がある場合は、 /チェーンを使用するか、動的コードを記述するdict代わりに、物事を に入れる価値があるかもしれません。例:ifelif

def b(self):
    return {'Buy': 'BUY SET', 'Sell': 'SELL SET', 'Trade': 'TRADE SET',
            'Barter': 'BARTER SET', 'Steal': 'STEAL SET'}[self.a()]

def b(self):
    return '{} SET'.format(order.upper())

これらは前の質問に対して異なる選択をすることに注意してください。dictバージョンは、不明な値に対して aをKeyError発生させます。バージョンはformat何でも有効なものとして扱います。

また、 a を使用する場合はdict、おそらくそれをb関数の外に移動する必要があります。たとえば、クラス属性にします (これにより、適切な名前を付けることが推奨されます)。

ただし、選択肢が 2 つだけの場合は、あなたが持っているものの方がはるかに明確だと思います。

最後に、関数に意味のない 1 文字の名前を付けるのはあまり Pythonic ではありません。次のようにしたほうがよいでしょう。

def get_formatted_order(self):
    order = self.calculate_order()
    if order == 'Buy':
        return 'BUY SET'
    elif order == 'Sell':
        return 'SELL SET''
于 2013-01-10T23:59:34.013 に答える
4

辞書を使用できます:

def b(self):
    return {'Buy': "BUY SET", 'Sell': "SELL SET"}.get(self.a())

または、より明確に書かれています:

def b(self):
    d = {"Buy": "BUY SET",
        "Sell": "SELL SET"}
    return d.get(self.a())
于 2013-01-10T23:57:36.273 に答える
2

Although abarnet's answer is definitely the most conclusive, for the given code, this would also work:

def b(self):
    return self.a().upper() + " SET"

But that's making a lot of assumptions that aren't very generalizable.

于 2013-01-11T00:11:02.117 に答える
1

キャッシュしないのはなぜですか?

def b(self):
    a = self.a()

    if a == 'Buy':
        return 'BUY SET'
    elif a == 'Sell':
        return 'SELL SET''

変数にも読みやすい名前を付けます。まったく説明的ではありませんab

于 2013-01-11T00:00:02.023 に答える
1

abarnertここで作成したすべてのクールな推奨事項の後、コードを短縮するためのもう 1 つのトリックを試すことができます。

def get_formatted_order(self):
    order = self.calculate_order()        
    return 'BUY SET' if order == 'Buy' else 'SELL SET'

これは、三項演算子の Pythonic 形式です。注文が「Buy」と評価された場合、関数は「BUY SET」を返します。逆の場合は「SELL SET」を返します

于 2013-01-23T18:32:16.257 に答える