2017-11-13 6 views
0

私はDjangoのソースコードを調べることによってプロフェッショナルなコードを作成する方法を学んでいます。 django.urls.resolvers | Django documentation | Djangogetattr(object、 'name'、False)v.sl hasattr(object、 'name')

、それ読み取り:

class LocaleRegexProvider(object): 
    def describe(self): 
     description = "'{}'".format(self.regex.pattern) 
     if getattr(self, 'name', False): 
      description += " [name='{}']".format(self.name) 
     return description 

Iはgetattr(self, 'name', False):がより可読コードによってhasattr

として hasattr(self, 'name')

exmapleについて

In [22]: if getattr(str,'split',False): 
    ...:  print("Str has 'split' attribute") 
    ...: else: 
    ...:  print("Str has not 'split' attribute") 
    ...: 
Str has 'split' attribute 
In [25]: if getattr(str,'sp',False): 
...:  print("Str has 'sp' attribute") 
...: else: 
...:  print("Str has not 'sp' attribute") 
...: 
Str has not 'sp' attribute 

を置換することができると仮定します0

hasattrと思われます。

この点をカバーしていない比較については質問があります。 Python hasattr vs getattr - Stack Overflow

この場合、getattr()を適用する方が良いでしょうか?

答えて

2

hasattrgetattrは、この場合異なるものであり、この場合は互換性がありません。

nameの値が空の文字列に設定されているとします。 hasattr(self, 'name')Trueを返しますが、getattr(self, 'name', False)はその空の文字列を返します。ブール値のコンテキストではFalseと評価されます。

getattrコールを置き換えるには、if hasattr(self, 'name') and self.name:のようなものが必要です。これは、1つではなく2つの属性参照を行います。

関連する問題