web-dev-qa-db-ja.com

Python: "..%(var)s .."%locals()を使用するのは良い習慣ですか?

私はこのパターン(またはアンチパターン)を発見し、とても満足しています。

私はそれがとても機敏だと感じています:

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をタプル内の一致する位置に保持する必要はありません。

あなたはそれが好きですか?使用しますか/使用しますか?はい/いいえ、説明してください。

70
flybywire

決して百万年。書式設定のコンテキストが何であるかは不明です。localsにはほとんどすべての変数を含めることができます。 self.__dict__はあいまいではありません。将来の開発者がローカルなものとローカルでないものに頭を悩ませるのは完全にひどいです。

それは意図的な謎です。なぜそのような将来のメンテナンスの頭痛の種を組織に負わせるのですか?

10
S.Lott

組み込み機能を利用して、記述する必要のあるコードを削減しているので、これは素晴らしいパターンだと思います。私はそれをかなりPythonicと個人的に見つけます。

書く必要のないコードを書くことはありません。コードを少なくすることは、コードを増やすよりも優れています。たとえば、このようにlocals()を使用することにより、コードを少なくすることができ、読みやすく、理解しやすくなります。

10
Andrew Hare

「いとこ」に関しては、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)
10
pfctdayelise

"%(name)s" % <dictionary>以上の"{name}".format(<parameters>)には、

  • 「%0s」より読みやすい
  • 引数の順序から独立している
  • 文字列内のすべての引数を使用せざるを得ない

Python 3(- PEP 3101 による)でそれを行う方法である必要があるため、私はstr.format()を優先する傾向があり、すでに2.6から利用可能ですが、locals()を使用する場合は、次のようにする必要があります。

print("hello {name} you are {age} years old".format(**locals()))
8
RedGlyph

組み込みのvars([object])documentation )を使用すると、2番目の見栄えがよくなる場合があります。

def example2(obj):
    print "The file at %(path)s has %(length)s bytes" % vars(obj)

もちろん効果は同じです。

6
u0b34a0f6ae

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'

参照:

1
Jacktose