10

定義内の関数名を変更するいくつかの方法を試しましたが、失敗しました。

>>> def f():
        pass
>>> f.__name__
'f'
>>> def f():
        f.__name__ = 'new name'
>>> f.__name__
'f'
>>> def f():
        self.__name__ = 'new name'
>>> f.__name__
'f'

ただし、name属性を定義した後で変更することはできます。

>>> def f():
        pass
>>> f.__name__ = 'new name'
>>> f.__name__
'new name'

定義でそれを変更/設定する方法はありますか(デコレータを使用する以外)?

4

5 に答える 5

26

関数本体は、関数を実行するまで実行されません。ただし、デコレータを使用できます。

def rename(newname):
    def decorator(f):
        f.__name__ = newname
        return f
    return decorator

そして、次のように使用します。

@rename('new name')
def f():
    pass
print f.__name__

ただし、関数はまだとしてのみ到達可能fです。

于 2012-06-03T22:35:53.800 に答える
3

__name__いいえ。これに最も近いのは、各インスタンスが初期化子に設定されている呼び出し可能クラスを定義することです。

于 2012-06-03T22:31:08.793 に答える
2

関数本体は、関数を呼び出すまで実行されないため、関数本体を使用して定義時に何が起こるかを変更する方法はありません。とにかくなぜこれをしたいのですか?関数を作成していて、別の名前を付けたい場合は、別の名前で定義してください。

于 2012-06-03T22:32:02.360 に答える
0

関数本体に入れると、の実行の一部がfその名前をに設定していることを意味し'new name'ます。明らかに、関数が呼び出される前は何もしません。

デコレータを使用することは、関数がそのブロックだけで示されるものとは少し異なることを宣言するための標準的な方法であり、defこれ以上良いものを見つけることはできません。

于 2012-06-03T22:44:00.763 に答える
0

これはおそらく愚かですが、ちょっとうまくいきますか?

>>> f = None
>>> def new_name():
    global f
    f = new_name


>>> new_name()
>>> f
<function new_name at 0x01945108>
>>> f.__name__
'new_name'
于 2012-06-03T22:53:53.667 に答える