- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含多个辅助函数的函数。这是相当普遍的情况。我想将它们放在一个共同的上下文中以提高可读性,我想知道如何正确地做到这一点。
简化示例:
def create_filled_template_in_temp(path, values_mapping):
template_text = path.read_text()
filled_template = _fill_template(template_text, values_mapping)
result_path = _save_in_temp(filled_template)
return result_path
def _fill_template(template_text, values_mapping):
...
def _save_in_temp(filled_template):
_, pathname = tempfile.mkstemp(suffix='.ini', text=True)
path = pathlib.Path(pathname)
path.write_text(text)
return path
...
create_filled_template_in_temp(path, values_mapping)
请注意,我不想要模块级别的辅助方法,因为它们只属于一个方法。想象一下,在同一个模块中有几个这样的例子。模块级别的许多非公共(public)功能。一团糟(这种情况发生了很多次)。另外我想给他们上下文并使用上下文的名称来简化内部命名。
解决方案 #0:模块
把它放在另一个模块中:
template_fillers.create_in_temp(path, values_mapping)
问题:
最后,代码太少,无法为其添加模块。
解决方案 #1:A 类
创建一个没有 __init__
且只有一个公共(public)(按照命名约定)方法的类:
class TemplateFillerIntoTemp:
def run(self, path, values_mapping):
template_text = path.read_text()
filled_template = self._fill_template(template_text, values_mapping)
result_path = self._save_in_temp(filled_template)
return result_path
def _fill_template(self, template_text, values_mapping):
...
def _save_in_temp(self, filled_template):
_, pathname = tempfile.mkstemp(suffix='.ini', text=True)
path = pathlib.Path(pathname)
path.write_text(text)
return path
...
TemplateFillerIntoTemp().run(path, values_mapping)
这是我过去多次做的。问题:
解决方案 #2:静态类
采取解决方案#1,在所有地方添加@staticmethod
。也可能是 ABC 元类。
TemplateFillerIntoTemp.run(path, values_mapping)
Pro:有一个明确的迹象表明这一切都是实例无关的。缺点:代码更多。
解决方案 #3:使用 __call__ 上课
采用解决方案 #1,使用 main 方法创建一个 __call__
函数,然后在模块级别创建一个名为 create_filled_template_in_temp
的实例。
create_filled_template_in_temp(path, values_mapping)
专业版:像单个函数一样调用。缺点:实现被夸大了,不符合目的。
解决方案 #4:将辅助函数插入主函数
将它们添加到里面。
def create_filled_template_in_temp(path, values_mapping):
def _fill_template(template_text, values_mapping):
...
def _save_in_temp(filled_template):
_, pathname = tempfile.mkstemp(suffix='.ini', text=True)
path = pathlib.Path(pathname)
path.write_text(text)
return path
template_text = path.read_text()
filled_template = _fill_template(template_text, values_mapping)
result_path = _save_in_temp(filled_template)
return result_path
...
create_filled_template_in_temp(path, values_mapping)
Pro:如果总行数很少并且辅助函数很少,这看起来不错。缺点:否则不会。
最佳答案
#4 的修改:创建内部函数,并将函数体作为内部函数。这具有仍然从上到下阅读的好特性,而不是让正文一直在底部。
def create_filled_template_in_temp(path, values_mapping):
def body():
template_text = path.read_text()
filled_template = fill_template(template_text, values_mapping)
result_path = save_in_temp(filled_template)
return result_path
def fill_template(template_text, values_mapping):
...
def save_in_temp(filled_template):
_, pathname = tempfile.mkstemp(suffix='.ini', text=True)
path = pathlib.Path(pathname)
path.write_text(text)
return path
return body()
(我不关心前导下划线,所以它们没有存在。)
关于python - 如何在没有副作用的情况下对功能进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253517/
这2个有什么区别?一个使用 SideEffect,另一个不使用。 “每次成功重组都会调用 SideEffect”,但如果没有 SideEffect,它也会在每次重组时运行。 @Composable f
我在 DOM 元素引用方面遇到了一些问题,我想我已经追踪到它与更新 innerHTML 有关。 在这个例子中,在第一次警告时,两个变量引用同一个元素,正如预期的那样。奇怪的是,在更新父元素(body)
如果有人问过这个问题,请原谅我,但我似乎找不到它。 我正在尝试创建一个数组并反转它(不使用反转)这段代码完美运行: function reverseArrayInPlace(array) { fo
如果 reflector 是正确的(我倾向于相信它是正确的),这就是 Any() 的实现: public static bool Any(this IEnumerable source) {
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否可以用 LINQ 中的 lambda 表达式替换 foreach 循环 (.Select))? List l = {1, 2, 3, 4, 5}; foreach (int i in l)
我在一本书上读到以下说法: n = ((i++) > (j)?(i++):(j)); 书上说假设i>j,n有一个意想不到的值,i增加了两次。 我不明白为什么n在这句话之后有一个期望值。 我读了很多关于
我对更改 LD_LIBRARY_PATH 有奇怪的副作用。 当我附加一个包含库的路径时,例如: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 然后,一切都
有人能告诉我下面一行中“副作用”的含义吗? If you're calling an EL function that doesn't return anything, then you're cal
是否有为包含副作用的 Java/JVM 语言方法编写 javadoc 的标准或最佳实践? 我定义了一个 void 方法,它修改了方法参数之一,但不知道如何记录实际返回值(因为没有实际返回)。 /**
我正在学习副作用和纯函数。我知道纯函数没有副作用,对于相同的参数,它们的返回值是相同的。我想知道 C 函数 strcmp() 是否是纯函数。我相信它是纯粹的,因为给定相同的两个字符串作为参数,结果将始
我正在尝试创建佛罗里达州的点密度图。虽然我知道 Highmaps 不支持带有 map 点的颜色轴。我扩展了它并且它有效,但它带来了副作用。当我单击图例中的某一类别时,不会发生隐藏。例如,如果我单击“>
我在 CS50 中研究 PSET 4,似乎遇到了 sprintf 更改不相关变量的问题。我只给出了没有揭示我的解决方案的代码...... #include #include #include t
我已经实现了这样的 UnaryOperation struct Converter { Converter( std::size_t value ): value_( valu
使用点符号调用自定义 getter 是否有副作用? 我一直在通过点符号在 Objective-C 中使用合成的 getter,即 tree.fruitnumber 返回树中果实的数量。我必须自定义 s
我无法理解页面 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/void 中的这一段: This ope
我有一个在 IIS7 下运行的 Web 应用程序。我将全局变量存储在一个带有静态变量的类中。该类称为 SessionVariables 并且在其中例如我有以下内容: public class Sess
运行命令时 ng-packagr -p ng-package.json 我得到以下输出 Building Angular library - - - skipped 8 lines - - - Sid
我想模拟一个 OverflowError 因为我想在引发异常之后测试变量的值。但是,我不知道如何使用我正在使用的库复制 OverflowError。我在此特定测试中使用的库是 pysolar.sola
当我尝试在可变 Map 中插入一个元素时,我希望这个元素插入到我的 Map 而不是返回 Map(如 PF,不可变对象(immutable对象) ecc ...)出于这个原因,我使用了可变集合,但在我的
我是一名优秀的程序员,十分优秀!