In Python, puoi usare la dir
funzione su qualsiasi oggetto per ottenere un elenco dei nomi delle sue funzioni di istanza:
>>> 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']
Mi chiedo se questa potrebbe essere una tecnica di golf utile in un programma che chiama diverse funzioni con nomi lunghi. In tal caso, potrei creare una funzione di selezione delle funzioni F
:
F=lambda o,i:eval('o.'+dir(o)[i])
Supponiamo ora di avere una stringa s
e di voler archiviare il risultato della scrittura in maiuscolo della prima lettera nella variabile c
. Quindi, invece di c=s.capitalize(),
notare che si capitalize
trova nella posizione 33 nell'elenco precedente e procedi come segue:
s='abc'
c=G(s,33)()
che assegna 'Abc'
ac
.
La mia domanda è se è probabile che questo funzioni per la maggior parte del tempo. In particolare,
- Posso sempre contare sull'elenco ordinato lessicograficamente per valori ASCII?
- Ci sono molte modifiche all'elenco di disponibili tra le versioni minori?
- Esistono differenze tra le implementazioni?
Inoltre, qualcuno l'ha mai usato prima su PPCG?
dir(__builtins__)
. Ed ecco una funzione alternativa: F=lambda o,i:getattr(o,dir(o)[i])
.
()
alla fine in questo F
modo: F=lambda o,i:eval('o.'+dir(o)[i])()
Quindi c=F('abc',33)
verrà assegnato 'Abc' c
.