23

関数呼び出しからの文字列を新しいフォーマット構文でフォーマットする方法はありますか? 例えば:

"my request url was {0.get_full_path()}".format(request)

そのため、format 関数のパラメーターとしてではなく、文字列get_full_pathで関数関数を呼び出します。

編集:これはおそらく私の欲求不満をよりよく示す別の例です。これは私が望むものです:

"{0.full_name()} {0.full_last_name()} and my nick name is {0.full_nick_name()}".format(user)

これは私が避けたいものです:

"{0} and {1} and my nick name is {2}".format(user.full_name(), user.full_last_name(), user.full_nick_name())
4

5 に答える 5

20

オブジェクトを変更できるかどうかはわかりませんが、オブジェクトを変更またはラップして、関数のプロパティを作成できます。次に、それらは属性のように見え、次のようにすることができます

class WrapperClass(originalRequest):
    @property
    def full_name(self):
        return super(WrapperClass, self).full_name()

"{0.full_name} {0.full_last_name} and my nick name is {0.full_nick_name}".format(user)

これは合法です。

于 2013-11-05T19:20:13.673 に答える
8

Python は、変数補間を直接サポートしていません。これは、他の言語がサポートする特定の機能 (つまり、文字列での関数呼び出し) が欠けていることを意味します。

ですから、ノー以外に言うべきことは何もありません。そんなことはできません。これは、Python の書式設定構文がどのように機能するかだけではありません。

あなたが持っている最高のものはこれです:

"my request url was {0}".format(request.get_full_path())
于 2013-11-05T18:34:36.730 に答える
1

この非常に奇妙なことはどうですか?

"my request url was %s and my post was %s"\
    % (lambda r: (r.get_full_path(), r.POST))(request)

説明:

  1. フォーマットの古典的な方法
  2. リクエストを受け取り、必要なものを含むタプルを返す Lambda 関数
  3. 文字列の引数としてラムダ インラインを呼び出します。

私はまだあなたのやり方の方が好きです。

読みやすさが必要な場合は、これを行うことができます:

path, post = request.get_full_path(), request.POST
"my request url was {} and my post was {}".format(path, post)
于 2013-11-05T18:39:19.197 に答える