En Python, vous pouvez utiliser la dir
fonction sur n'importe quel objet pour obtenir une liste des noms de ses fonctions d'instance:
>>> dir('abc')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__','__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Je me demande si cela pourrait être une technique de golf utile dans un programme qui appelle plusieurs fonctions longuement nommées. Dans un tel cas, je pourrais créer une fonction de sélection de fonction F
:
F=lambda o,i:eval('o.'+dir(o)[i])
Supposons maintenant que j'ai une chaîne s
et que je souhaite stocker le résultat de la mise en majuscule de sa première lettre dans la variable c
. Ensuite, au lieu de, c=s.capitalize(),
je pourrais noter que capitalize
c'est à la position 33 dans la liste ci-dessus et faire ce qui suit:
s='abc'
c=G(s,33)()
qui attribue 'Abc'
à c
.
Ma question est de savoir si cela est susceptible de fonctionner la plupart du temps. En particulier,
- Puis-je toujours compter sur la liste triée lexicographiquement par valeurs ASCII?
- Y a-t-il de nombreux changements dans la liste des versions mineures disponibles?
- Existe-t-il des différences entre les implémentations?
De plus, quelqu'un a-t-il déjà utilisé cela sur PPCG?
dir(__builtins__)
. Et voici une autre fonction: F=lambda o,i:getattr(o,dir(o)[i])
.
()
à la fin de la F
manière suivante: F=lambda o,i:eval('o.'+dir(o)[i])()
Ensuite c=F('abc',33)
, vous affecterez «Abc» à c
.