IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Avoir de multiples '*args, **kwargs' est-il possible dans une fonction ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut Avoir de multiples '*args, **kwargs' est-il possible dans une fonction ?
    On connaît le schéma classique pour passer des arguments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f(*args, **kwargs):
         <du code>
    Mais je voudrais utiliser une méthode comme ci-dessous, le nombre "n" de tuples variant de 0 à un nombre maximal fixé dans mon application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f((*args_1, **kwargs_1), (*args_2, **kwargs_2), ... , (*args_n, **kwargs_n), **kwargs)
        <du code>
    Pour produire ce type d'appel :

    foo((20, 30, a='xx', b='yy'), (50, 60, 20, a='ww'), globalparam='zz')

    A priori c'est impossible, mais est-ce (raisonnablement) contournable ? Merci.

  2. #2
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Bonjour,

    Ton code semble tout à fait faisable, car tu regroupes les différents args/kwargs dans des tuples, ce qui permet de les identifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def foo(*a,**k): % chaque tuple dans *a <=> (*a(n),**k(n))
        all_a= [aa[0] for aa in a] % tous les args
        all_k= [aa[1] for aa in a]% tous les kwargs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Malheureusement ça ne semble pas fonctionner. Copier le dernier exemple que je donne avec "foo", par exemple.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Avec l’assignation dans le tuple difficile...
    Sinon pourquoi ne pas utiliser des dico ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def foo(*a, **k):
        pass
    foo((20, 30, {'a':'xx'}, {'b':'yy'}), (50, 60, 20, {'c':'ww'}), globalparam='zz')
    @+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Je précise le contexte. En fait j'écris un programme avec une interface dans lequel l'utilisateur manipule et créer des objets, disons "Bar" pour l'exemple. Pour une question d'ergonomie, j'aimerais beaucoup que l'initialisation puisse se faire comme je l'indique, dans mon cas réel il y aura beaucoup de paramètres, or cette forme est très expressive et me semble la meilleure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Bar:
     
        def __init__(self, *args, **kwargs)
            <code>
            self.__foo(args, kargs)
            <code>
     
        def __foo(self, *args, **kwargs)
            <code>
    invite de commande :
    my_bar = Bar((20, 30, a='xx', b='yy'), (50, 60, 20, a='ww'), globalparam='zz')

    J'aimerais que l'utilisateur n'ai pas à créer des objets intermédiaires (des dictionnaires par exemple).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    @PauseKawa

    Le meilleur compromis possible semble celui que vous proposez : utiliser des dictionnaires anonymes incorporés dans les n tuples.

    Merci.

Discussions similaires

  1. [Flex4] multiples appels d'un même service dans une fonction
    Par polo31 dans le forum Flex
    Réponses: 5
    Dernier message: 01/08/2012, 14h54
  2. Réponses: 6
    Dernier message: 26/04/2010, 13h44
  3. Réponses: 11
    Dernier message: 06/11/2006, 22h51
  4. Select case est-il possible dans ce cas ?
    Par rangernoir dans le forum Access
    Réponses: 10
    Dernier message: 30/09/2005, 16h06
  5. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo