2011-12-10 7 views
0

は、このコードを見てください属性:書き込みビジネスルールの可能な、存在しないの連鎖

>>> class c(object): 
... pass 
... 
>>> a=c() 
>>> if a.b.c: 
... print 'hello' 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'c' object has no attribute 'b' 

静かに!これは問題ではありません。

エンタープライズソフトウェア(例えば、django)を開発する人は、ビジネスルールを書く必要があります。 この規則は

if invoice.customer.adress.country in ...: 
    invoice.makeSomeSpecialOffer() 

のように見えます。しかし、いくつかの回、表現上のオブジェクトのinvolvedsの一つが存在しません。その後、には、エラーを回避私はと文を書き換えsould:

if invoice.customer and 
    invoice.customer.adress and 
    invoice.customer.adress.country and 
    invoice.customer.adress.country in ... 

これは読みにくくです! (hasattrで試してみることもできますが、あまり読みにくい)。

私のwork arroundはif文をtryで囲みますが、この種のエラーを避けるためにはよりエレガントなまたはpythatonicな方法がありますか?あなたの好きなテクニックはどれですか?

+0

この月http://stackoverflow.com/questions/610883/how-to-know-if-an-object-has-an-attribute-in-python – ditkin

+0

@ditkinの複製である、このリンクについての感謝!しかし、私の質問は、オブジェクトが属性を持っているかどうかを知ることではなく、紛らわしい可能性のある属性を連鎖させるエレガントな方法でコードを書く方法です。私はタイトルを変更しました。どうもありがとう。 – danihp

+0

'invoice'、' custom'、 'address'などのオブジェクトの種類は? –

答えて

1

これは読みにくいです! (hasattrでも試してみることができますが、それ以外は読むことが少なくなります )。

もう1つのオプションは、try 'exceptブロックに囲むことです。

try: 
    if invoice.customer.adress.country in ...: 
     invoice.makeSomeSpecialOffer() 
except AttributeError: 
    None 

あなたはhasattrたりしてみてください-以外のような反応性のような積極的なチェックを行うことができます。可読性は認識であり、どちらのアプローチも例外ではありません。チェーンチェックする

+0

はい、これは私の問題として説明しています。「私の仕事は、試しに文を入れれば」 – danihp

+0

@danihp私は上記の記事を読んだだけですが、残念ながらこれはあなたがすべきではありません。私のコメントのリンクを読んでください。 – Abhijit

+0

申し訳ありません。私は正しく英語を話しません、私が言いたいことは:私は私の質問で説明するようにこれが解決策であることを知っている、私はこれを行うための他の方法を求めます。あなたは「別のオプション」について話しますが、これは別のオプションではありません。このオプションは質問テキストに囲まれています。これはあなたの質問を正しいものとしてマークすることができないためです。質問文に近い解決策として@boracaglayan答えをチェックします。あなたの時間をありがとう。また、あなたのコメントのリンクはどこですか? – danihp

2

は、以下の機能が役立つかもしれない属性:

def get_chainedattr(parobj, *args): 
    try:   
     ret = parobj 
     for arg in args: 
      ret = getattr(ret, arg) 
     return ret 
    except AttributeError: 
     return None 

私はそれがより読みやすいかどうかわからないのですが、この機能を使って、あなたの例は次のように書くことができます。

if get_chainedattr(invoice, "customer", "adress", "country") in ...: 
    invoice.makeSomeSpecialOffer() 
+0

これは間違っています。 「熟語と反慣用句in Python」の[except](http://docs.python.org/howto/doanddont.html#except)のセクションを読んでください。 – Abhijit

+0

ありがとう、例外名を追加するのを忘れていました。あなたは今答えの問題を見ますか? –

+0

私はあなたのアプローチが好きでしたが、どういうわけか例外を捕まえたやり方は正しくはありませんでした。あなたがそれを修正した後、これは本当に良いです。 – Abhijit

関連する問題