Pourquoi est-ce que je reçois une erreur "TypeError: Method () prend exactement 1 argument (2 donné) dans Python à l'aide de l'API du répertoire?

StackOverflow https://stackoverflow.com/questions/19842347

Question

J'essaie d'écrire un script de ligne de commande qui fonctionne avec les unités d'organisation dans notre domaine Google Apps. Par conséquent, en utilisant les nombreuses documents alambiqués de Google à ce sujet, j'ai réussi à créer l'application dans la console API, à exciter Admin SDK et à me connecter avec succès dans mon script. Cependant, lorsque je crée l'objet de service Directory (qui semble réussir), j'ai des problèmes en interagissant avec lui parce que je reçois ce message. J'ai également installé le package API Python. Voici mon code actuel:

import argparse
import httplib2
import os
import sys
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials

f = file("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-privatekey.p12", "rb")
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(
    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com",
    key,
    scope = "https://www.googleapis.com/auth/admin.directory.orgunit"
)

http = httplib2.Http()
http = credentials.authorize(http)

directoryservice = build("admin", "directory_v1", http=http)
orgunits = directoryservice.orgunits()

thelist = orgunits.list('my_customer')

Lorsque j'exécute ce code, je reçois le message d'erreur:

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    orgunits.list('my_customer')
TypeError: method() takes exactly 1 argument (2 given)

J'ai essayé sans utiliser l'alias "my_customer", mais l'erreur se plaint que je ne l'ai pas fournie. Toute aide serait appréciée, je n'ai pas utilisé Python depuis très longtemps; Il peut très bien être une erreur de l'utilisateur.

Était-ce utile?

La solution

Je ne connais pas l'API Google Apps, mais il semble que

orgunits.list () est défini comme:

class FactoryObject(object):
    # ... Code Here ...

    def list(self, **kwargs):
         if 'some_parameter' not in kwargs:
             raise Exception('some_parameter required argument')
         # ... code that uses kwargs['some_parameter']
         return True

Donc, si j'exécute ces commandes:

>>> orgunits.list()
Exception: some_parameter required argument
>>> orgunits.list('my_customer')
TypeError: list() takes exactly 1 argument (2 given)
>>> orgunits.list(some_parameter='my_customer')
True

La prochaine fois que vous verrez l'erreur, essayez d'ajouter le nom du paramètre à votre liste d'arguments et voyez si cela résout votre problème.

Plus d'information:

L'opérateur de déballage du dictionnaire (**) n'agit pas comme un argument normal dans une liste de paramètres. Si vous passez un argument positionnel, quand c'est le seul argument de la liste, il lancera une erreur (comme vous l'avez vu) car le code s'attend à un argument de mot-clé à la place.

L'opérateur de déballage peut accepter des arguments de mots clés arbitraires et les utiliser dans un dictionnaire.

Autres conseils

Serait-ce que Python passe self automatiquement? Je suis aussi un peu nouveau pour Python, donc je ne sais pas quand Python fait cela, mais cela m'a causé une certaine confusion dans le passé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top