【发布时间】:2018-03-10 16:43:10
【问题描述】:
我想知道实现一个可以在不同模式下运行的函数的最 Pythonic 方式,即根据调用它的模式执行稍微不同的任务。
例如,我有以下基于一组输入索引提取 numpy 数组的子集。通常,我希望将这些索引作为[xMin, xMax, yMin, yMax] 形式的列表或元组传递,但有时我可能希望提供中心点和宽度/高度,如([xCoord, yCoord], [width, height])。 (注意这是空间数据&xMin、yMin等参考数组边界的空间坐标。)
def get_subset(array, *args):
## If window extents are given
if len(args) == 1:
[(xMin,xMax,yMin,yMax)] = args
## Set NULL extents to array bounds
if xMin is None: xMin = array.xMin
if xMax is None: xMax = array.xMax
if yMin is None: yMin = array.yMin
if yMax is None: yMax = array.yMax
## Convert window extents to array indices
winLx = int(xMin - array.xMin)
winRx = int(xMax - array.xMin)
winBy = int(array.yMax - yMin)
winTy = int(array.yMax - yMax)
## If window centroid and dimensions are given
elif len(args) == 2:
[(easting,northing),(width,height)] = args
# Convert input coordinates into array indices
xCell = int(easting - array.xMin)
yCell = int(array.yMax - northing)
# Generate L(eft), R(ight), T(op) and B(ottom) window extents
winLx = xCell - width//2
winRx = xCell + width//2
winBy = yCell + height//2
winTy = yCell - height//2
subset = array.data[winTy:winBy, winLx:winRx, :]
有没有更好、更简洁或更 Pythonic 的方式来做到这一点?过去,我曾尝试在我的函数中使用mode 参数,然后使用if 循环来获得我想要的功能(类似于get_subset(array, window, mode='extent')),最终与我上面显示的没有太大不同。但是我想知道是否有一种很好的方法来使用装饰器或其他一些 python 功能来实现这一点。
【问题讨论】:
-
为什么不使用两个独立的函数?
-
更 Pythonic 的方式是没有一个函数执行两个不同的事情。
-
SRP - 与 OCP、LSP、ISP 一起出现和DIP:SOLID
-
我开始怀疑将它压缩到一个函数中是不是一个坏主意。我想我的问题是:是否可以将这两个功能分开,同时将它们合并到一个可以执行我想要的功能的功能中?这似乎是合理的,因为从概念上讲,过程没有区别,只是窗口的构造方式有所不同。这就是为什么我想知道是否有一种方便的方式来使用装饰器,例如处理来自 2 个不同窗口构造方法的输入并将窗口传递给单个子集提取方法 - 或者这仍然是不好的形式?
-
另外,感谢@PatrickArtner 提供的链接,它很有帮助。
标签: python