En mi caso, utilizo un método donde paso los parámetros que necesito:
Por ejemplo, en mi clase persistencia, el select es así:
def select(self, columnas: STR_ARRAY = None, filtros: STR_ARRAY = "",
orden: STR_ARRAY = "", foraneas: STR_DICT = "",
desde: int = 0, cantidad: int = None, distintas: bool = False,
grupos: STR_ARRAY = "", teniendo: STR_ARRAY = "",
modulo: str = INDEFINIDO, mostrar: bool = True) -> tuple:
"""Busca registros que cumplan una condición
Los parámetros columnas, filtros, orden, foráneos, grupos, cuando y teniendo,
pueden ser cadenas. En esos casos, no se valida esa parte.
:param cantidad: cantidad a recuperar (todos si None, que es por omisión)
:param columnas: datos a retornar (todos si None)
Puede ser str o ARRAY, si ARRAY puede ser ARRAY de str o de ARRAYs.
Si None, asume '*' todos los campos.
Si str: corresponde al sql de las columnas a devolver (con funciones, etc.)
No se valida internamente.
Si ARRAY: puede ser ARRAY de str (a)
Si (a), es una lista de columnas [alias.]nombre
(si múltiples tablas deben incluir el alias de la tabla respectiva)
la cadena puede contener expresiones (no se validan)
:param desde: registro inicial en el recupero, mínimo 0 OFFSET
:param distintas: filas distintas (cláusula DISTINCT si True).
Error si se indican funciones o agrupamientos de columnas.
:param filtros: condiciones de filtro (ver armar filtros para forma presentar)
:param foraneas: diccionario con descripción de tablas foráneas:
{BASE: alias_tabla_base,
alias_tabla_base: (persistencia, BASE, pk, None),
alias_tabla_no_base: (persistencia, JOIN, pk, fk), <- tantas como requiera}
Donde JOIN: LEFT, INNER, ... pk tendrá por omision alias tabla_base,
si el join es con otra tabla, incorporará en origen alias correspondiente
:param grupos: nombres o
números de columna para agrupar (incompatible con
distintas. Campos de grupos no pueden ser funciones, las columnas
solicitadas deben figurar en grupos
:param orden: lista nombres o números de columnas para ordenar
:param teniendo: condiciones de filtro para grupos
:param modulo: módulo desde se invoca el select.
:param mostrar: Si verdadero, convierte los datos en cadena, columna Estado
es convertida de código a Texto explicado.
:return cantidad registros encontrados, tupla con datos o ...
0: No encontró ninguno, -2: error en datos,
-4: error motor persistencia, -5: error en foráneos,
-6: datos mal estructurados, -7: error en filtro"""
Acá te paso la cabecera de la función. Uso Annotations, que permite verificar al escribir que el tipo de datos sea apropiado (tanto cuando usas la variable dentro del método, cuando pasas parámetros a las funciones/métodos o cuando manejas los retornos (return) de ellos.
Las annotaciones también se pueden usar como metadata dentro de los códigos, lo que permite por ejemplo usar decoradores genéricos para validar que los datos pasados sean correctos
Saludos: Miguel