En Python, puede usar la dir
función en cualquier objeto para obtener una lista de los nombres de sus funciones de instancia:
>>> 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']
Me pregunto si esta podría ser una técnica de golf útil en un programa que requiera varias funciones con nombres largos. En tal caso, podría crear una función de selección de función F
:
F=lambda o,i:eval('o.'+dir(o)[i])
Ahora suponga que tengo una cadena s
y quiero almacenar el resultado de poner en mayúscula su primera letra en la variable c
. Entonces, en lugar de c=s.capitalize(),
, podría notar que capitalize
está en la posición 33 en la lista anterior y hacer lo siguiente:
s='abc'
c=G(s,33)()
que asigna 'Abc'
a c
.
Mi pregunta es si es probable que esto funcione la mayor parte del tiempo. En particular,
- ¿Puedo contar siempre con que la lista se clasifique lexicográficamente por valores ASCII?
- ¿Hay muchos cambios en la lista de disponibles entre versiones menores?
- ¿Existen diferencias entre implementaciones?
Además, ¿alguien ha usado esto antes en PPCG?
dir(__builtins__)
. Y aquí está una función alternativa: F=lambda o,i:getattr(o,dir(o)[i])
.
()
al final de la F
misma manera: F=lambda o,i:eval('o.'+dir(o)[i])()
luego c=F('abc',33)
asignará 'Abc' a c
.