【问题标题】:Possible to change function name in definition?可以在定义中更改函数名称吗?
【发布时间】:2012-06-03 22:28:31
【问题描述】:

我尝试了几种方法来更改定义中的函数名称,但都失败了。

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

但我可以在定义后更改名称属性。

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

有什么方法可以在定义中更改/设置它(除了使用装饰器)?

【问题讨论】:

  • self.__method__() 不起作用的原因是因为self 是从解释器传递给参数的参数。没有将实例传递给您的函数的机制。 (顺便说一句,变量名不必是self,也可以是foo,或bar 或其他)
  • 您是否正在编写此代码以确保工作安全? :)
  • 这并不能回答您的问题,但我认为您会发现它很有趣,因为它解释了函数引用的一些“名称”:medium.com/@vadimpushtaev/name-of-python-function-e6d650806c4

标签: python function attributes


【解决方案1】:

在你执行函数之前,函数体不会被执行。你可以使用装饰器:

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

然后像这样使用它:

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

但是,该功能仍然只能通过f 访问。

【讨论】:

  • 嗨@ThiefMaster。但是如何更改函数的名称并使其可以访问?
【解决方案2】:

没有。最接近这一点的是定义一个可调用类,每个实例都在初始化程序中设置其__name__

【讨论】:

    【解决方案3】:

    在你调用函数之前,函数体不会被执行,所以你无法使用函数体来改变定义时发生的事情。你为什么要这样做呢?如果您正在编写函数并希望它具有不同的名称,只需使用不同的名称定义它。

    【讨论】:

    • 我最初想要它是因为我认为我需要它(创建一个返回函数的函数,该函数的名称基于外部函数的参数)。然后我意识到我不需要在内部函数定义中这样做,但无论如何我还是很好奇。
    【解决方案4】:

    如果你把它放在函数体中,你是说f执行部分将它的名字设置为'new name'。显然,在函数被调用之前,这不会做任何事情。

    使用装饰器声明函数与单独的def 块稍有不同的规范方式,您不会找到更好的方法。

    【讨论】:

      【解决方案5】:

      这可能很愚蠢,但有点工作?

      >>> f = None
      >>> def new_name():
          global f
          f = new_name
      
      
      >>> new_name()
      >>> f
      <function new_name at 0x01945108>
      >>> f.__name__
      'new_name'
      

      【讨论】:

      • 这确实不是很好。您正在通过希望仍然存储它的变量名称来寻址函数,但是当您调用该函数时,它可能已经存储在某些函数数组中,并且全局变量 f 可能会被删除或重用于其他用途。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2021-11-20
      • 2018-01-20
      • 2017-08-14
      • 2011-05-31
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多