Consiglio Python: portabilità della chiamata di funzione introspettiva


14

In Python, puoi usare la dirfunzione 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 se di voler archiviare il risultato della scrittura in maiuscolo della prima lettera nella variabile c. Quindi, invece di c=s.capitalize(),notare che si capitalizetrova 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?


Ho visto cose simili fatte con JavaScript e C #.
Peter Taylor,

2
È anche possibile fare questo con i comandi incorporati: dir(__builtins__). Ed ecco una funzione alternativa: F=lambda o,i:getattr(o,dir(o)[i]).
grc

Si noti inoltre che a seconda delle funzioni che si prevede di utilizzare, è possibile aggiungere ()alla fine in questo Fmodo: F=lambda o,i:eval('o.'+dir(o)[i])()Quindi c=F('abc',33)verrà assegnato 'Abc' c.
FryAmTheEggman,

Risposte:


6

Dalla documentazione :

L'elenco risultante è ordinato in ordine alfabetico

Per quanto riguarda le differenze, penso che dovrai controllare (e specificare nella tua risposta è probabilmente una buona idea). Ci sono chiare differenze tra python 2 e 3, ad esempio, è __nonzero__stato rinominato __bool__.

Non ho mai sentito parlare di differenze tra le implementazioni, ma non riesco a trovare riferimenti su questo.

Non penso che questo sia stato usato prima in parte perché raramente ti salverà alcun personaggio rispetto a fare qualcosa di simile:

F=str.capitalize
s='abc'
c=F(s)

Dovresti usare diverse funzioni diverse dir()per far valere la pena.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.