0
votes

Fonction avec une autre fonction comme argument facultatif

J'essaie d'écrire une fonction qui prend une autre fonction comme argument facultatif. Je suis un peu coincé (et confus) avec la syntaxe. Je veux que Func2 soit un argument facultatif. Donc, je veux seulement que cela fonctionne quand je l'appelle dans Func1. Je veux que cela fonctionne comme une fonction de filtre pour quand j'ai des modèles de fichiers plus complexes. glob.glob (fichiers + '/ *') code> peut donner à tous les fichiers dans les répertoires spécifiés. (Glob.Glob (chemin + '/' + File_Name + '*')) CODE> peut donner des modèles plus complexes, je ne sais tout simplement pas comment la mettre en œuvre comme argument de fonction optionnel. Toute aide serait très appréciée!

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'))


0 commentaires

3 Réponses :


1
votes

La seule différence est la façon dont vous passez la fonction. Vous passez actuellement le code> retour code> de FUNC2 ('test2') code>, vous devez simplement passer Func2 code>. Assurez-vous également de passer des fichiers code> à FUNC2, sinon cela ne sera pas défini.

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')


4 commentaires

Mais quand j'appelle Func1, je veux rechercher le fichier nommé "Test2" - je ne pense pas que je le ferais avec cette implémentation?


Ensuite, vous devriez ajouter cela ainsi qu'une variable ajoutée @says


Y a-t-il une façon de les intégrer à des deux, alors j'appelle Func2 avec le nom de fichier que je cherche?


@says peut-être, je ne saurais pas comment. J'ai mis à jour ma réponse pour réfléchir à la manière dont je voudrais passer 'test_2' comme fichier que vous souhaitez vérifier pour utiliser autre_variable



1
votes

Dans votre première fonction, utilisez le type d'argument en option avec un nom différent.

Ceci suffira pour compléter votre code. P>

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 commentaires

Mais lorsque j'appelle Func1, je veux rechercher le fichier nommé "Test2", donc j'ai besoin de préciser cela quelque part.



1
votes

Alternativement, vous pouvez retarder l'appel à Func2 en passant le paramètre en tant que lambda xxx

ou si vous utilisez un nom de fichier différent ultérieurement xxx


4 commentaires

Merci Fonnparr, je ne suis pas sûr de savoir comment j'étais implémenter cela dans le reste de mon code? Je n'ai jamais utilisé les fonctions de Lambda pour des calculs mathématiques simples. Peux-tu élaborer?


Lorsque votre code trouve Func2 ('test') dans votre code, il essaie de l'exécuter immédiatement et vous donne le résultat, puis passe ce résultat sur l'appel Func1. En mettant la Lambda _: sur le devant de cela - il dit qu'il existe maintenant une fonction anonyme (avec le paramètre ignoré _) qui appelle maintenant ceci. C'est cette fonction anonyme de Lambda que vous passez à Func1 comme deuxième paramètre, ce qui ne s'appelle donc que lorsque nécessaire. Sur deuxième pensées - j'ai modifié ma réponse pour utiliser le nom de fichier que vous avez besoin plus tard sur


Donc, de mon message d'origine, aurais-je seulement besoin de modifier l'appel de la fonction. Func1 (['C: \ Chemin \ \ to \ Files1 \', 'C: \ Chemin \ to \ Files2 \'], Lambda 'Test2': Func2 ('Test2')) ?


Cela ne fonctionnerait pas très bien: essayez Func1 (['C: \ Chemin \ to \ Files1 \', 'C: \ Path \ to \ Files2 \'], Lambda _: Func2 ('Test2'))