Python est mon premier langage dynamique. J'ai récemment codé un appel de fonction en fournissant un nombre erroné d'arguments. Cela a échoué avec une exception au moment où cette fonction a été appelée. Je m'attendais à ce que, même dans un langage dynamique, ce type d'erreur puisse être détecté lors de l'analyse du fichier source.
Je comprends que le type des arguments réels n'est pas connue avant l'appel de la fonction, car la même variable peut contenir des valeurs de n'importe quel type à différents moments. Mais la numéro des arguments est connu dès que le fichier source est analysé. Il ne va pas changer pendant l'exécution du programme.
Pour que ce ne soit pas une question philosophique
Pour rester dans le cadre de Stack Overflow, laissez-moi formuler la question comme suit. Python offre-t-il une fonctionnalité qui l'oblige à retarder la vérification du nombre d'arguments dans un appel de fonction jusqu'à ce que le code soit réellement exécuté ?
17 votes
Et si le nom fait référence à une fonction totalement différente au moment de l'exécution ?
0 votes
Ainsi, comme contre-argument, le nombre d'arguments pour invoquer
f(*args)
ne sera pas connu pendant la phase d'analyse syntaxique.0 votes
@Rogalski mais d'un autre côté, aucun nombre d'arguments positionnels à cela ne soulèverait la
TypeError
!3 votes
Il convient de noter que, dans la théorie des types, le type des valeurs inclut le nombre d'arguments, dans le cas des fonctions.
9 votes
Comment Python peut-il savoir quelle fonction vous allez appeler jusqu'à ce que vous essayiez réellement de l'appeler ? Ce n'est pas comme si les fonctions en Python avaient des noms. (Ce n'est pas un sarcasme)
0 votes
L'identité de la fonction appelée peut être modifiée pendant l'exécution du programme.
1 votes
@immibis : Eh bien, non. Ils ont des noms. Ils ne sont pas particulièrement ci-joint à ces noms, cependant. Une fonction définie comme
def foo(): whatever
afoo.__name__ == 'foo'
mais cela ne vous empêchera pas de fairefoo = some_other_function
obar = foo
.