【发布时间】: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 仅处理两者共有的内容。
-
我注意到几乎任何时候我想从一个函数中得到类似但不同的东西,我通常想要一个不同的函数。也许我需要制作两个新功能并将不常见的行为提取到这些新功能中......但我预测你的未来会很痛苦。 (不过蛋糕很棒)
-
您可以让
functionA和functionB设置functionC在调用时检查的模块级全局值。唯一比只向functionC传递附加参数更可取的情况是,如果出于某种原因您可以更改三个函数的实现,但不能更改functionC的签名。
标签: python