Si vous souhaitez transmettre des fonctions avec des nombres d'arguments différents comme arguments de la même fonction, vous pouvez utiliser lambda.
Supposons que vous ayez les sources suivantes:
#Fonction sans argument
def print_type1():
print('print_Type de traitement1 ...')
return '[print_type1]'
def print_com(func):
print('=== print_Traitement com ...===')
rtn = func() #Lors de l'utilisation, il n'y a pas d'argument dans la fonction à passer
print('{}A été traité.'.format(rtn))
print()
print_com(print_type1) #Fonctionne bien
Vous voudrez peut-être attribuer une fonction avec un argument à print_com plus tard. Exemple:
#Fonction avec argument
def print_type2(day):
print('print_Type de traitement2 ...')
print('day: {}'.format(str(day)))
return "print_type2"
La méthode d'affectation suivante échouera.
print_com(print_type2) # →[missing 1 required positional argument: 'day']J'obtiens l'erreur"
print_com(print_type2(15)) # →['str' object is not callable]J'obtiens l'erreur
Donc, si vous le changez en une fonction sans argument avec lambda et que vous le passez ensuite, cela fonctionnera.
day = 15
print_com(lambda: print_type2(day))
Vous pouvez également utiliser une partie des functools.
from functools import partial
day = 15
print_com(partial(print_type2, day=day))
Si vous voulez le résoudre vous-même, vous pouvez le faire en définissant la fonction à l'intérieur de la fonction.
#Fonction interne
def print_type3(day):
def print_type3_inner():
print('print_Type de traitement3 ...')
print('day: {}'.format(str(day)))
return "print_type3"
return print_type3_inner
day = 15
print_com(print_type3(day))
lambda01.py
from functools import partial
#Fonction sans argument
def print_type1():
print('print_Type de traitement1 ...')
return '[print_type1]'
def print_com(func):
print('=== print_Traitement com ...===')
rtn = func() #Lors de l'utilisation, il n'y a pas d'argument dans la fonction à passer
print('{}A été traité.'.format(rtn))
print()
#Fonction avec argument
def print_type2(day):
print('print_Type de traitement2 ...')
print('day: {}'.format(str(day)))
return "print_type2"
#Fonction interne
def print_type3(day):
def print_type3_inner():
print('print_Type de traitement3 ...')
print('day: {}'.format(str(day)))
return "print_type3"
return print_type3_inner
print_com(print_type1) #Fonctionne bien
#↓ Une telle méthode d'attribution échouera
# print_com(print_type2) # →[missing 1 required positional argument: 'day']J'obtiens l'erreur
# print_com(print_type2(15)) # →['str' object is not callable]J'obtiens l'erreur
#Si vous le changez en une fonction sans argument avec lambda et que vous le passez ensuite, cela fonctionnera.
day = 15
print_com(lambda: print_type2(day))
#Ou
day += 1
print_com(partial(print_type2, day=day))
day += 1
print_com(print_type3(day))
Résultat d'exécution === Traitement print_com ... === Traitement print_type1 ... Traité [print_type1].
=== Traitement print_com ... === Traitement print_type2 ... day: 15 Type d'impression traité2.
=== Traitement print_com ... === Traitement print_type2 ... day: 16 Type d'impression traité2.
=== Traitement print_com ... === Traitement print_type3 ... day: 17 Type d'impression traité3.
Recommended Posts