Add default arguments to delegation
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Empieza leyendo las implementaciones existentes de delegates y use_kwargs, así como el decorador add_kwargs propuesto, usando inspect.signature. Comprueba cómo se representan actualmente las firmas delegadas y los valores predeterminados, y determina después si el comportamiento solicitado puede conservar las sobrescrituras explícitas del llamador y un orden válido de los parámetros. La tarea estará terminada cuando la API de delegación admita estos valores predeterminados con cobertura para el escenario descrito de cnn y resnet.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Scenario:
You have function a, e.g:
def cnn(c_in, c_mid, c_out, act, bn=.., ..., blocks=CNNBlock): ...
and you want to add a specification for it:
def resnet(c_in, c_mid, c_out, act=relu, bn=..., ..., blocks=ResBlock): ... return cnn(...)
Right now as far as I understand this is the implementation:
use_kwargs(blocks=ResBlock)
delegates(cnn)
def resnet(c_in, c_mid, c_out, act=relu, **kwargs):
if 'blocks' not in kwargs: kwargs['blocks'] = ResBlock
...
cnn(c_in, c_mid, c_out, act, **kwargs
So I'm thinking of doing this instead:
add_kwargs(act=relu, blocks=ResBlock)
delegates(cnn)
def resnet(c_in, c_mid, c_out, **kwargs):
...
return cnn(c_in, c_mid, c_out, **kwargs)
example of implementation:
def add_kwargs(**kwargs):
"Decorator: add argument with default value to `**kwargs` in both signature and function"
def _f(f):
@wraps(f)
def _inner(*args, **kw): return f(*args, **{**kwargs, **kw})
sig = inspect.signature(_inner)
sigd = dict(sig.parameters)
for k,v in kwargs.items():
if k in sigd.keys():
assert sigd[k].kind.name not in ['POSITIONAL_ONLY', 'VAR_KEYWORD', 'VAR_POSITIONAL'], \
f'cannot assign an existing variable ({k!r}) of type {sigd[k].kind.name}'
sigd[k] = sigd[k].replace(default=v, kind=inspect._ParameterKind.KEYWORD_ONLY)
else: sigd[k] = inspect.Parameter(k, inspect._ParameterKind.KEYWORD_ONLY, default=v)
params = [[p for p in sigd.values() if p.kind == t] for t in range(5)]
_inner.__signature__ = sig.replace(parameters=concat(*params))
return _inner
return _f
What do you think?
- Lenguaje dominante
- Jupyter Notebook
- Estrellas
- 1.1k
- Forks
- 295
- Merge medio
- 1 min
- PR fusionados (30 d)
- 4
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de AnswerDotAI/fastcore
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
AnswerDotAI/fastcore#933 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
AnswerDotAI/fastcore#930 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
AnswerDotAI/fastcore#911 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
AnswerDotAI/fastcore#910 ·
-
`docments(full=True)` drops `**kwargs` docments unless `args_kwargs=True` is passed explicitlyAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
AnswerDotAI/fastcore#909 ·
Todos los issues de AnswerDotAI/fastcore
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
gruntwork-io/boilerplate#329 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
freeCodeCamp/curriculum-helpers#607 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
PedestrianDynamics/pyFDS-Evac#326 ·
Los mantenedores suelen responder en 1 día