将另一个函数作为可选参数的函数

Function with another function as an optional argument

我正在尝试编写一个将另一个函数作为可选参数的函数。我对语法有点困惑(和困惑)。我希望 func2 成为可选参数。所以我只希望它在我在 func1 中调用它时起作用。当我有更复杂的文件模式时,我希望它能作为一个过滤函数。 glob.glob(files + '/*')可以给出指定目录下的所有文件。 (glob.glob(path + '/' + file_name + '*')) 可以给出更复杂的模式,我只是不确定如何将它实现为一个可选的函数参数。任何帮助将非常感激!

import glob

def func1(dirs, func2):

    if type(dirs) == list:
        for files in dirs:
            files = glob.glob(files + '/*')
            print(files) # prints all of the file names in each directory given
            if func2:
                func2(file_name)          



def func2(file_name):
    if file_name in files:
        print(file_name)
        # (glob.glob(path + '/' + file_name + '*'))

func1(['C:\path\to\files1\', 'C:\path\to\files2\'], func2('test2'))

对于此示例,假设 \files1 包含 'test1.txt' 和 'test2.txt',files2 包含 'test1.jpg' 和 'test2.jpg'。我希望 func1 打印 test2.txt 和 test1.jpg 的路径。

唯一的区别是传递函数的方式。您目前正在通过 func2('test2')return,您应该只通过 func2。还要确保将 files 传递给 func2,否则将无法定义。

import glob

def func1(dirs, func2, another_variable):

    if type(dirs) == list:
        for files in dirs:
            files = glob.glob(files + '/*')
            print(files) # prints all of the file names in each directory given
            if func2:
                func2(another_variable, files)          



def func2(file_name, files):
    if file_name in files:
        print(file_name)
        # (glob.glob(path + '/' + file_name + '*'))

func1(['C:\path\to\files1\', 'C:\path\to\files2\'], func2, 'test_2')

在您的第一个函数中,使用不同名称的可选参数类型。

这足以完成您的代码。

import glob

def func1(dirs, printer=False):

    if type(dirs) == list:
        for files in dirs:
            files = glob.glob(files + '/*')
            print(files) # prints all of the file names in each directory given
            if printer is True:
                func2(file_name)          



def func2(file_name):
    if file_name in files:
        print(file_name)
        # (glob.glob(path + '/' + file_name + '*'))

# EXECUTE WITHOUT FUNCTION CALLING FUNC2
func1(['C:\path\to\files1\', 'C:\path\to\files2\'])

# EXECUTE WITH FUNCTION CALLING FUNC2
func1(['C:\path\to\files1\', 'C:\path\to\files2\'],True)

或者,您可以通过将参数作为 lambda 传递来延迟对 func2 的调用

func1(['C:\path\to\files1\', 'C:\path\to\files2\'], lambda _ : func2('test2')) 

或者如果您稍后使用不同的文件名

func1(['C:\path\to\files1\', 'C:\path\to\files2\'], lambda x : func2(x))