私はこのパターン(またはアンチパターン)を発見し、とても満足しています。
私はそれがとても機敏だと感じています:
def example():
age = ...
name = ...
print "hello %(name)s you are %(age)s years old" % locals()
時にはそのいとこを使用します:
def example2(obj):
print "The file at %(path)s has %(length)s bytes" % obj.__dict__
人工的なタプルを作成してパラメーターをカウントし、%sをタプル内の一致する位置に保持する必要はありません。
あなたはそれが好きですか?使用しますか/使用しますか?はい/いいえ、説明してください。
決して百万年。書式設定のコンテキストが何であるかは不明です。locals
にはほとんどすべての変数を含めることができます。 self.__dict__
はあいまいではありません。将来の開発者がローカルなものとローカルでないものに頭を悩ませるのは完全にひどいです。
それは意図的な謎です。なぜそのような将来のメンテナンスの頭痛の種を組織に負わせるのですか?
組み込み機能を利用して、記述する必要のあるコードを削減しているので、これは素晴らしいパターンだと思います。私はそれをかなりPythonicと個人的に見つけます。
書く必要のないコードを書くことはありません。コードを少なくすることは、コードを増やすよりも優れています。たとえば、このようにlocals()
を使用することにより、コードを少なくすることができ、読みやすく、理解しやすくなります。
「いとこ」に関しては、obj.__dict__
の代わりに、新しい文字列フォーマットを使用した方が見栄えがよくなります。
def example2(obj):
print "The file at {o.path} has {o.length} bytes".format(o=obj)
私はこれをreprメソッドによく使用します。
def __repr__(self):
return "{s.time}/{s.place}/{s.warning}".format(s=self)
"%(name)s" % <dictionary>
以上の"{name}".format(<parameters>)
には、
Python 3(- PEP 3101 による)でそれを行う方法である必要があるため、私はstr.format()を優先する傾向があり、すでに2.6から利用可能ですが、locals()
を使用する場合は、次のようにする必要があります。
print("hello {name} you are {age} years old".format(**locals()))
組み込みのvars([object])
( documentation )を使用すると、2番目の見栄えがよくなる場合があります。
def example2(obj):
print "The file at %(path)s has %(length)s bytes" % vars(obj)
もちろん効果は同じです。
Python 3.6.0: formatted string literals のように、これを行う公式の方法があります。
それはこのように動作します:
f'normal string text {local_variable_name}'
例えば。これらの代わりに:
"hello %(name)s you are %(age)s years old" % locals()
"hello {name} you are {age} years old".format(**locals())
"hello {} you are {} years old".format(name, age)
これを行うだけです:
f"hello {name} you are {age} years old"
これが公式の例です:
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
参照: