有时在编写python软件时,我最终会遇到一种情况,即我不确定是使用带有子函数的函数,还是只使用类。在这些情况下,我有一系列不同的输入,我想对它们应用一些变换,然后产生一个不同的输出。而且我不太关心从输入到输出过程中创建的任何变量。所以感觉它应该是一个简单的功能,而不是一个类。但是对于这些情况,它也涉及相当复杂的一系列操作,通常需要子函数,这些子函数仅在将输入转换为输出的过程中有用,而不是更普遍的意义。
在一天结束时,我通常只想使用:
来调用它output = my_function(input)
所以我可以做类似
的事情def my_function(input):
def subfunc1(blah):
return blah1output
def subfunc2(blah):
return blah2output
#lots of complex code here that calls subfunc1 and subfunc2
return output
但是,然后同事X可能会说,哇,看起来像一个非常复杂的功能,你应该使用一个类!或者我可以这样做
class my_function(object):
def __new__(self, input):
#lots of complex code here that calls subfunc1 and subfunc2
return output
@staticmethod
def subfunc1(blah):
return blah1output
@staticmethod
def subfunc2(blah):
return blah2output
但是,这似乎是一个奇怪的用途,因为我并不真正关心创建和维护类的实例。
在这里使用类的一个主要优点是,您可以更轻松地测试subfunc1和subfunc2
,仅此一点可能是使用它的充分理由。
然而,由于我还不熟悉编程,有人可能会为生产环境和/或通常最pythonic的解决方案提出最佳解决方案吗?
答案 0 :(得分:2)
@ wwii的评论是正确答案。
详细说明,你的直觉是正确的,创建一个可以作为单例的类可能不是pythonic - 模块是执行此操作的首选方法(这里是programming faq中的斜向引用)
你也是正确的,能够测试你的子功能是好的。将它们从函数体中拉出来的另一个原因是因为Python作为一种解释语言,否则每次调用外部函数时都会重建子函数。
Benjamin Gleitzman光荣的howdoi module(链接到他的github回购)是一个很好的例子,说明如何将复杂的问题分解成小的,非常易读的部分 - 遵循PEP 8哲学“扁平比嵌套“好”,简单比复杂“
更好修改强>
这是一个可以掩盖内部函数的简单模块(python tutorial on modules)的示例。结构是:
mymodule
|____
|___ __init__.py
|___ submodule.py
__init__.py
中的:
"""
This docstring shows up when someone does `help(mymodule)`.
"""
from submodule import my_function
submodule.py
中的:
def _subfunc1(x):
"""A preceding underscore signals to the reader that it's an internal function."""
return x + 1
def _subfunc2(x):
return x * 2
def my_function(x):
"""Yours will be cooler."""
return _subfunc1(x) * _subfunc2(x)
使用它:
>>> import mymodule
>>> result = mymodule.my_function(5)
>>>
>>> # But internal functions (not imported) won't be visible...
>>> mymodule._subfunc1(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '_subfunc1'