Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Add default arguments to delegation

Ouverte
#175 7 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
35/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
python
Domaine
tooling

Piste de recherche

Commencez par lire les implémentations existantes de delegates et use_kwargs, ainsi que le décorateur add_kwargs proposé, en utilisant inspect.signature. Vérifiez comment les signatures déléguées et les valeurs par défaut sont actuellement représentées, puis déterminez si le comportement demandé peut préserver les remplacements explicites effectués par l’appelant et un ordre valide des paramètres. La tâche est terminée lorsque l’API de délégation prend en charge ces valeurs par défaut avec une couverture du scénario cnn et resnet décrit.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

waiting for response

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?

Langage dominant
Jupyter Notebook
Étoiles
1.1k
Forks
295
Merge moyen
1 min
PR mergées (30 j)
4

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de AnswerDotAI/fastcore

Toutes les issues de AnswerDotAI/fastcore

Issues similaires

Plus d'issues DevTools

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.