Tengo un dictado, que necesito para pasar clave / valores como argumentos de palabra clave .. Por ejemplo ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Esto funciona bien, pero si hay valores en el d_args dict que no son aceptados por la example
función, obviamente muere. Digamos, si la función de ejemplo se define comodef example(kw2):
Esto es un problema ya que no controlo ni la generación de d_args
, ni la example
función .. Ambos provienen de módulos externos, y example
solo aceptan algunos de los argumentos de palabras clave del dict ..
Idealmente solo haría
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Probablemente solo filtraré el dict, de una lista de argumentos de palabras clave válidos, pero me preguntaba: ¿Hay alguna manera de enumerar programáticamente los argumentos de palabras clave que toma una función específica?
inspect.getargspec(f)
está en desuso desde Python 3.0; el método moderno esinspect.signature(f)
.co_varnames
opción, por otro lado, funciona en ambos.Esto imprimirá los nombres de todos los argumentos aceptables, palabras clave y no palabras clave:
Esto se debe a que primero
co_varnames
son siempre los parámetros (después son las variables locales, comoy
en el ejemplo anterior).Entonces ahora podrías tener una función:
Que luego podrías usar así:
EDITAR : Una pequeña adición: si realmente necesita solo argumentos de palabra clave de una función, puede usar el
func_defaults
atributo para extraerlos:Ahora puede llamar a su función con argumentos conocidos, pero kwargs extraídos, por ejemplo:
Esto supone que
func
no utiliza magia*args
o no**kwargs
en su firma.fuente
En Python 3.0:
fuente
Para una solución de Python 3, puede usar
inspect.signature
y filtrar de acuerdo con el tipo de parámetros que le gustaría conocer.Tomando una función de muestra con parámetros posicionales o de palabras clave, solo palabras clave, var posicional y var:
Puede crear un objeto de firma para él:
y luego filtrar con una lista de comprensión para descubrir los detalles que necesita:
y, de manera similar, para posicionales var usando
p.VAR_POSITIONAL
y la palabra clave var withVAR_KEYWORD
.Además, puede agregar una cláusula al if para verificar si existe un valor predeterminado al verificar si
p.default
es igualp.empty
.fuente
Ampliando la respuesta de DzinX:
fuente