Python - 如何为许多类似结构的函数创建一般批处理函数

时间:2015-02-15 00:31:13

标签: python function

如果之前有人问我,我很抱歉,但我不完全确定如何表达这个问题。

我创建了一组非常类似结构的函数,它们使用PIL对图像执行操作。它们的内部工作方式在某些情况下是不同的,但它们都接受完全相同的参数,图像的路径和输出目录的路径。

在某些情况下,我希望能够在单个图像上调用此函数,但有时候我还要传递一个充满图像的文件夹并让它在所有图像上运行它的魔力。

我的问题是:是否可以编写一个通用批处理函数,它将根据其输入调用另一个函数?基本上我希望能够输入函数A,函数B或函数C作为函数D的参数,并让函数D调用它。

编辑:以下是我拥有的两个函数的一些示例:

def desaturate(in_img, out_dir):
    im = Image.open(in_img)
    converter = PIL.ImageEnhance.Color(im)
    im2 = converter.enhance(0)
    im2.save(out_dir + r"\\" + splitext(basename(in_img))[0] + "_desaturate.tiff")

def save_as_tiff(in_img, out_dir):
    im = Image.open(in_img)
    im.save(out_dir + r"\\" + splitext(basename(in_img))[0] + ".tiff")

那么我希望有一个通用函数接受文件夹路径作为其第一个参数,然后将所需函数作为第二个参数。有没有办法接受一个字符串作为参数,然后让它以某种方式将其转换为函数调用?

2 个答案:

答案 0 :(得分:1)

未经测试,但任何原因导致你无法做到这样的事情:

def doAll(in_img, out_dir, funcs):
    for func in funcs:
        func(in_img, out_dir)

doAll(in_img, out_dir, [desaturate, save_as_tiff])

答案 1 :(得分:0)

如果我理解你的问题,你想要在目录树中处理一堆文件,并且你希望该目录处理函数是通用的,将worker-function作为参数来处理每个图像。

如果这是正确的,这是一个简化的例子:

import os
import sys

def directory_processor(source_dir, out_dir, worker_func, *xs, **kws):
    for root, dirs, files in os.walk(source_dir):
        for f in files:
            in_img = os.path.join(root, f)
            worker_func(in_img, out_dir, *xs, **kws)


# One of your image-processing functions.
def desaturate(in_img, out_dir, *xs, **kws):
    print 'desaturating', in_img, out_dir, xs, kws

# To experiment with this script, pass the source_dir and
# out_dir as command-line arguments.    
directory_processor(sys.argv[1], sys.argv[2], desaturate, 'blort', foo = 1)

请注意,我在函数签名中包含了*xs, **kws,如果需要,可以将任意位置和关键字参数传递给图像处理函数。

关于你的具体问题(有没有办法接受字符串作为参数,然后以某种方式将其转换为函数调用?):通常没有必要这样做;你可以将函数本身(而不是字符串名称)传递给另一个函数,如上所示。