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'))
3 Réponses :
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')
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 code>
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)
Mais lorsque j'appelle Func1, je veux rechercher le fichier nommé "Test2", donc j'ai besoin de préciser cela quelque part.
Alternativement, vous pouvez retarder l'appel à Func2 en passant le paramètre en tant que lambda ou si vous utilisez un nom de fichier différent ultérieurement p>
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')) Code>?
Cela ne fonctionnerait pas très bien: essayez Func1 (['C: \ Chemin \ to \ Files1 \', 'C: \ Path \ to \ Files2 \'], Lambda _: Func2 ('Test2'))