【问题标题】:Is there a "pythonic" way to adjust a function's definition?是否有一种“pythonic”方式来调整函数的定义?
【发布时间】:2020-10-14 21:50:04
【问题描述】:

我正在使用一个经常使用useful_function(obj) 的模块。我的问题是我希望useful_function 的行为与正常情况略有不同。目前,我正在使用以下方法来解决我的问题:

original_useful_function = useful_function

def useful_function(obj):
    if meets_criteria(obj):
        return my_desired_result(obj)
    return original_useful_function(obj)

然后我可以继续我的工作,因为我知道useful_function 的每次调用都会按照我想要的方式运行。但是,我很好奇是否有更好的方法来做到这一点。

【问题讨论】:

  • 我也在考虑装饰器。但是,我认为它不适合 OP 提出的问题,因为无论如何它都需要重新定义函数,或者直接调用装饰器,因此它具有与当前相同的间接级别。
  • 您能提供一些上下文,更详细地了解您的特定用例吗?作为一个通用问题,这似乎很好,但细节可能会带来更优雅的解决方案。
  • @JohnKugelman 是的,虽然我总是担心添加上下文会使问题在某些用户的脑海中偏离主题。
  • "Pythonic" 的方式是遵循 Python 的禅宗,即 "显式优于隐式", "简单胜于复杂”,并且“可读性很重要”。因此,创建一个具有完全不同名称的全新函数并使用该函数。弄清楚发生了什么。

标签: python


【解决方案1】:

我可以考虑定义一个 lambda,但仅此而已,我认为没有简单的方法可以避免重新分配有用的函数,除非该方法在一个类中并且我们使用 __getattribute__.. 做了一些魔术。 .

original_useful_function = useful_function
useful_function = lambda obj: my_desired_result(obj) if meets_criteria(obj) else original_useful_function(obj)

【讨论】:

    【解决方案2】:

    如果您经常这样做,您可以考虑使用装饰器。

    除此之外,我认为您所拥有的内容是清晰直接的。

    顺便说一句,您似乎正在使用 import * from foo?通常最好使用 import foo。

    【讨论】:

    • 如何装饰在别处定义的函数?
    • @JohnKugelman 你不会的。你想说什么?我得到它。你认为装饰器会被应用到它不是的东西上。
    • @JohnKugelman 装饰器毕竟只是函数。 @-style 只是 module.useful_function = my_decorator(module.useful_function) 的语法糖
    • 我是说你把装饰器放在哪里? OP 没有定义功能,他们正在修改它。 @ 去哪儿了?一个代码示例会有所帮助。
    猜你喜欢
    • 2012-02-15
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2012-03-19
    • 2015-07-10
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多