Discussion: optionally restoring argparse nargs/multiplicity support
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 30/100
Piste de recherche
Commencez par lire les composants internes du chargeur argparse, en particulier _KVArgParser, _DefaultOptionDict et _KVAction, ainsi que les modifications référencées dans #322 et #360. Déterminez comment la prise en charge de nargs optionnel devrait interagir avec les arguments positionnels et la multiplicité des traits ; l’issue ne sera prête qu’une fois ce comportement et ses tests définis d’un commun accord.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Hi, I realize this may be re-opening a can of worms, but I was looking for a way to re-support --key v1 v2 v3 for Container traits in argparse-based CLI handling, originally added in #322 by @ankostis. That support was one of the main reasons I felt comfortable refactoring a codebase to use traitlets. While trying to upgrade to traitlets==5.1, I found out that traitlets was now silently discarding v2 v3 due to https://github.com/ipython/traitlets/pull/582#issuecomment-671922717 (none of my applications use positional arguments).
I was able to patch this for my applications in a rather convoluted way by having them inherit a mixin to change the argparse loader, using #360:
class FixNArgsMixin(HasTraits):
def _create_loader(self, ..):
class _DefaultOptionDict(loader._DefaultOptionDict):
def _add_kv_action(self, key):
self[key] = loader._KVAction(
# ..
nargs="+", # not ideal, but not sure what else can be done, unless we restrict ourselves to Application.classes, resolve these traits and look up trait.multiplicity
)
class KVArgParser(argparse.ArgumentParser):
# same as loader.KVArgParser, but with _DefaultOptionDict
class KVArgParseConfigLoader(loader.KVArgParseConfigLoader):
parser_class = KVArgParser
return KVArgParserConfigLoader(..)
class MyApp(FixNArgsMixin, Application):
foo = List(config=True).tag(multiplicity="+")
MyApp().initialize(["--MyApp.foo", "a", "b"])
This is pretty verbose and frail since it re-implements a significant amount of the traitlets.config.loader internals. One idea I was considering is to support an allow_nargs=True argument to _KVArgParser() which will set nargs="+" in _DefaultOptionDict, and that way the above method could be shortened to return KVArgParserConfigLoader(.., allow_nargs=True).
Why I use nargs="+":
- Compatibility with existing script APIs
- Principle of least surprise, its natural to python users that lists can be built from CLI via
nargs="+", and matches theargparsebehavior of consumingnargs="+"instead of positional arguments - Significantly easier to type/autocomplete out
--App.my_long_trait_name 1 2 3 4vs--App.my_long_trait_name 1 --App.my_long_trait_name 2 --App.my_long_trait_name 3 --App.my_long_trait_name 4
Note: I understand that the multiplicity feature was buyer-beware since it was not officially released (and that traitlets is to an extent "semi-private"), and also the significant complexity in trying to handle nargs together with positional arguments, hence why I don't wish to request any changes in the current default behavior.
cc @minrk @Carreau, apologies in advance for wall of text
- Langage dominant
- Python
- Étoiles
- 653
- Forks
- 221
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de ipython/traitlets
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 65/100
-
Difficulté 1/5 1-3 heures Accessibilité débutants 65/100
-
Add Deprecation of Trait Declarations via Classes to Migration NotesPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertegood first issue
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
-
Document `TraitType.read_only`Ouvertedocumentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 65/100
-
traitlets.Set should support generic type annotations for type safetyPeut-être pris @GruffElixir l’a pris il y a 31 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
Toutes les issues de ipython/traitlets
Issues similaires
-
request-theme
Difficulté 2/5 Moins d'une heure Accessibilité débutants 70/100
LizardByte/ThemerrDB#8877 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
area/install-update comp/gateway P0 sweeper:risk-compatibility type/bug
Difficulté 2/5 Moins d'une heure Accessibilité débutants 72/100
NousResearch/hermes-agent#135997 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
deepset-ai/haystack#13199 ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG] JSONLoader rejects valid UTF-8 BOM filesPeut-être pris @zouyonghe l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
anthropics/knowledge-work-plugins#1298 ·
Les mainteneurs répondent en général sous 1 jour