estoy usando argspec en una función que toma otra función o método que el argumento, y devuelve una tupla de esta manera:marcador personalizado como en Pitón Ninguno
(("arg1", obj1), ("arg2", obj2), ...)
Esto significa que el primer argumento del pasado la función es arg1 y tiene un valor predeterminado de obj1, y así sucesivamente.
Aquí está el roce: si no tiene un valor predeterminado, necesito un valor de marcador de posición para indicar esto. No puedo usar None, porque entonces no puedo distinguir entre , ningún valor predeterminado y el valor predeterminado es None. Lo mismo para False, 0, -1, etc. Podría convertirlo en una tupla con un solo elemento, pero luego el código para verificarlo sería feo, y no puedo convertirlo fácilmente en un dict. Así que pensé en crear un objeto Ninguno-como que no es ninguno, y esto es lo que he llegado con:
class MetaNoDefault(type):
def __repr__(cls):
return cls.__name__
__str__ = __repr__
class NoDefault(object):
__metaclass__ = MetaNoDefault
ahora ("arg1", NoDefault)
indica arg1 no tiene ningún valor por defecto, y no puedo hacer las cosas como if obj1 is NoDefault:
etc. La metaclase lo hace imprimir como solo NoDefault
en lugar de <class '__main__.NoDefault'>
.
¿Hay alguna razón para no hacerlo así? ¿Hay una mejor solución?
¿Hay alguna razón por la que no se puede tener una sola tupla de un elemento para no tener valores predeterminados? Algo como: '((" arg1 ",), (" arg2 ", obj2), ...)' donde "arg1" no tiene valor predeterminado. A continuación, puede hacer si 'len (the_tuple) == 1' etc. – Fenikso
@FMc: para evitar errores provenientes de la modificación accidental de los argumentos predeterminados, es mejor nunca usar los valores predeterminados mutables. – lunaryorn
@Fenikso He cubierto esta posibilidad en mi pregunta. En resumen, me parece poco elegante, a pesar de que es intuitivo. –