【问题标题】:Returning different values based on where function is called from in Python根据在 Python 中调用函数的位置返回不同的值
【发布时间】:2016-03-31 19:45:23
【问题描述】:

我有两个函数,每个函数都调用第三个函数,但期望返回的结果略有不同。

所有函数都在单独的文件中。文件 A 和 B 不能互相导入,所以函数 A 和 B 不能互相调用。最好的组织方式是什么?

我想避免重复该函数,因为它大部分是相同的,以保持与 DRY 原则一致。

这是我所拥有的一些伪代码,以及我认为程序的结构:

#FileA.py
def functionA():
    useableData = functionC(rawData)

-

#FileB.py
def functionB():
    useableData = functionC(rawData)

-

#FileC.py
def functionC(rawdata):
    *Extensive processing/formatting of data*
    if C run from A:
        return useableData

    if C run from B:
        *A bit more processing of data*
        return useableData

我能想到的唯一解决方案是将第二个变量与rawdata 一起传递,该字符串表示它来自的函数的名称。但这对我来说似乎很不雅。

有没有理想的方法来做到这一点?也许不涉及检查从哪里调用函数,但仍然允许functionC 根据数据将返回的位置返回略有不同的结果。我也许可以稍微重构一下代码,但是所有三个函数都需要保留在它们当前的文件中。

【问题讨论】:

  • 虽然我认为这是一个可怕的想法,但总是有 traceback 模块。尽管在没有任何额外上下文信息的情况下根据调用者更改行为是一种不好的形式。添加一个额外的参数来指定要执行的处理的类型并不是一种糟糕的形式,尽管
  • 只需添加一个(可选的)第二个参数moreProcessing=False?
  • 我建议将特定于 fileA 所需的任何内容放入 functionA 中,并将特定于 fileB 的任何内容放入 functionB 中,并让 functionC 仅处理两者共有的内容。
  • 我注意到几乎任何时候我想从一个函数中得到类似但不同的东西,我通常想要一个不同的函数。也许我需要制作两个新功能并将不常见的行为提取到这些新功能中......但我预测你的未来会很痛苦。 (不过蛋糕很棒)
  • 您可以让functionAfunctionB 设置functionC 在调用时检查的模块级全局值。唯一比只向functionC 传递附加参数更可取的情况是,如果出于某种原因您可以更改三个函数的实现,但不能更改functionC 的签名。

标签: python


【解决方案1】:

为什么不直接添加一个额外的函数参数?

def functionC(rawdata, extra_processing=False):
    # extensive processing
    if extra_processing:
        # more processing
    return usable_data

然后在 A 中您将其称为 functionC(stuff),在 B 中您将其称为 functionC(stuff, extra_processing=True)

【讨论】:

    【解决方案2】:

    我认为你的方法是错误的。我会做的是这个

    def functionA():
        useabledata = functionC(rawData)
    
    
    def functionB():
        useabledata = functionD(functionC(rawData))
    
    
    def functionC(rawData):
       *Extensive processing/formatting of data*
    
    def functionD(partiallyProcessedData):
       *A bit more processing of data*
    

    其他选项如tobias_k所说,有一个可选的第二个参数

    def functionC(rawData, moreProcessing=False):
        *Extensive processing*
        if not moreProcessing:
            return data
        *more processing*
        return data
    

    然后这样称呼它

    def functionA()
        useabledata = functionC(rawData)
    
    def functionB()
        useabledata = functionC(rawData, True)
    

    一个更加封装的方法是

    def functionA():
        useabledata = functionC(rawData)
    
    
    def functionB():
        useabledata = functionD(rawData)
    
    
    def functionC(rawData):
       *Extensive processing/formatting of data*
    
    def functionD(rawData):
       partialProcessedData = functionC(rawData)
       *A bit more processing of data*
    

    【讨论】:

    • 这些都是组织它的好方法。我需要说明一下我到底想怎么做,但是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 2019-12-13
    • 1970-01-01
    • 2022-07-21
    • 2015-08-22
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多