Функция с другой функцией в качестве необязательного аргумента - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь написать функцию, которая принимает другую функцию в качестве необязательного аргумента. Я немного застрял (и запутался) с синтаксисом. Я хочу, чтобы 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.

Ответы [ 3 ]

1 голос
/ 10 января 2020

Внутри вашей первой функции используйте необязательный тип аргумента с другим именем.

Этого будет достаточно для завершения вашего кода.

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)

1 голос
/ 10 января 2020

В качестве альтернативы, вы можете отложить вызов 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)) 
1 голос
/ 10 января 2020

Разница лишь в том, как вы передаете функцию. В настоящее время вы проходите return из func2('test2'), вам нужно просто передать 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')
...