propias - lista de funciones de python
Determinación programática de la cantidad de parámetros que requiere una función: Python (6)
Convierta cada comando en una clase, derivada de una base abstracta que define la estructura general de un comando. En la medida de lo posible, la definición de propiedades de comando debe colocarse en variables de clase con métodos definidos en la clase base que maneja esos datos.
Registre cada una de estas subclases con una clase de fábrica. Esta clase de fábrica obtiene la lista de argumentos y decide qué comando ejecutar al crear instancias de la subclase de comando adecuada.
La comprobación de los argumentos es manejada por las propias subclases de comandos, utilizando métodos generales definidos correctamente a partir de la clase base del comando.
De esta forma, nunca necesitará codificar repetidamente las mismas cosas, y realmente no hay necesidad de emular la declaración de cambio. También hace que extender y agregar comandos sea muy fácil, ya que simplemente puede agregar y registrar una nueva clase. Nada más que cambiar
Esta pregunta ya tiene una respuesta aquí:
Estaba creando una sencilla utilidad de línea de comandos y utilizando un diccionario como una especie de declaración de caso con palabras clave que enlazan con su función apropiada. Todas las funciones tienen diferente cantidad de argumentos requeridos para que actualmente se compruebe si el usuario ingresó la cantidad correcta de argumentos necesarios para cada función. Puse la cantidad requerida dentro de la declaración de caso del diccionario en la forma {Keyword:(FunctionName, AmountofArguments)}
.
Esta configuración actual funciona perfectamente bien, sin embargo, me preguntaba por el interés de la autoevaluación si había una manera de determinar el número requerido de argumentos en una función y mis intentos de google han devuelto nada de valor hasta ahora, pero veo cómo args y kwargs podría atornillar tal comando debido a la cantidad ilimitada de argumentos que permiten.
En Python 3, utiliza someMethod.__code__.co_argcount
( someMethod.func_code.co_argcount
que someMethod.func_code.co_argcount
ya no funciona)
Esto ya ha sido respondido, pero sin el módulo de inspección también puede usar someMethod.func_code.co_argcount
Excelente pregunta Acabo de tener el problema de que quería escribir una función que toma un argumento de devolución de llamada. Dependiendo de la cantidad de argumentos de esa devolución de llamada, debe llamarse de manera diferente.
Comencé con la respuesta de gimel, luego la amplié para poder tratar con los builtins que no reaccionan bien con el módulo de inspect
( raise TypeError
).
Así que aquí está el código para verificar si una función espera exactamente un argumento:
def func_has_one_arg_only(func, typical_argument=None, ignore_varargs=False):
"""True if given func expects only one argument
Example (testbench):
assert not func_has_one_arg_only(dict.__getitem__), ''builtin 2 args''
assert func_has_one_arg_only(lambda k: k), ''lambda 1 arg''
assert not func_has_one_arg_only(lambda k,x: k), ''lambda 2 args''
assert not func_has_one_arg_only(lambda *a: k), ''lambda *a''
assert not func_has_one_arg_only(lambda **a: k), ''lambda **a''
assert not func_has_one_arg_only(lambda k,**a: k), ''lambda k,**a''
assert not func_has_one_arg_only(lambda k,*a: k), ''lambda k,*a''
assert func_has_one_arg_only(lambda k: k, ignore_varargs=True), ''lambda 1 arg''
assert not func_has_one_arg_only(lambda k,x: k, ignore_varargs=True), ''lambda 2 args''
assert not func_has_one_arg_only(lambda *a: k, ignore_varargs=True), ''lambda *a''
assert not func_has_one_arg_only(lambda **a: k, ignore_varargs=True), ''lambda **a''
assert func_has_one_arg_only(lambda k,**a: k, ignore_varargs=True), ''lambda k,**a''
assert func_has_one_arg_only(lambda k,*a: k, ignore_varargs=True), ''lambda k,*a''
"""
try:
import inspect
argspec = inspect.getargspec(func)
except TypeError: # built-in c-code (e.g. dict.__getitem__)
try:
func(typical_argument)
except TypeError:
return False
else:
return True
else:
if not ignore_varargs:
if argspec.varargs or argspec.keywords:
return False
if 1 == len(argspec.args):
return True
return False
raise RuntimeError(''This line should not be reached'')
Puede controlar el comportamiento relacionado con los argumentos varargs *args
y **kwargs
con el parámetro ignore_varargs
.
El parámetro typical_argument
es un kludge: si el inspect
no funciona, por ejemplo, en los builtins antes mencionados, entonces tratamos de llamar a la función con un argumento y ver qué pasa.
El problema con este enfoque es que hay varias razones para raise TypeError
: Se usa la cantidad incorrecta de argumentos o se usa un tipo de argumento incorrecto. Al permitir que el usuario proporcione un typical_argument
estoy tratando de eludir este problema.
Esto no es bueno Pero puede ayudar a las personas que tienen la misma pregunta y también al hecho de que inspect
no puede inspeccionar las implementaciones de funciones codificadas en C. Tal vez la gente tiene una mejor sugerencia?
Lo que quiere, en general, no es posible, debido al uso de varargs y kwargs, pero inspect.getargspec
(Python 2.x) e inspect.getfullargspec
(Python 3.x) se acercan.
Python 2.x:
>>> import inspect >>> def add(a, b=0): ... return a + b ... >>> inspect.getargspec(add) ([''a'', ''b''], None, None, (0,)) >>> len(inspect.getargspec(add)[0]) 2
Python 3.x:
>>> import inspect >>> def add(a, b=0): ... return a + b ... >>> inspect.getfullargspec(add) FullArgSpec(args=[''a'', ''b''], varargs=None, varkw=None, defaults=(0,), kwonlyargs=[], kwonlydefaults=None, annotations={}) >>> len(inspect.getfullargspec(add).args) 2
Obtenga los nombres y valores predeterminados de los argumentos de una función. Se devuelve una tupla de cuatro cosas: (args, varargs, varkw, por defecto). args es una lista de los nombres de los argumentos (puede contener listas anidadas). varargs y varkw son los nombres de los argumentos * y ** o Ninguno. los valores predeterminados son una tupla de valores de argumento predeterminados o Ninguno si no hay argumentos predeterminados; si esta tupla tiene n elementos, corresponden a los últimos n elementos listados en args.