Por que estou recebendo um erro "TypeError: Method () leva exatamente 1 argumento (2 dado) no Python usando a API de diretório?

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

Pergunta

Estou tentando escrever um script de linha de comando que funcione com unidades de organização em nosso domínio do Google Apps. Portanto, usando a documentação complicada do Google, criei com sucesso o aplicativo no console da API, liguei o Admin SDK e conectei com sucesso no meu script. No entanto, quando crio o objeto de serviço do diretório (que parece ter sucesso), estou tendo problemas interagindo com ele porque recebo essa mensagem. Eu também instalei o pacote da API do Python. Aqui está meu código atual:

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')

Quando eu executo esse código, recebo a mensagem de erro:

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

Eu tentei sem usar o alias "my_customer", mas o erro reclama que não o forneci. Qualquer ajuda seria apreciada, não uso Python há muito tempo; muito bem pode ser um erro do usuário.

Foi útil?

Solução

Não estou familiarizado com a API do Google Apps, mas parece que

orgunits.list () é definido como:

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

Então, se eu executar esses comandos:

>>> 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

Então, da próxima vez que você vir o erro, tente adicionar o nome do parâmetro à sua lista de argumentos e ver se isso resolve seu problema.

Mais Informações:

O Operador Despacado do Dicionário (**) não age como um argumento normal em uma lista de parâmetros. Se você passar em um argumento posicional, quando esse é o único argumento na lista, ele lançará um erro (como você viu) porque o código está esperando um argumento de palavra -chave.

O operador Unplack pode aceitar argumentos de palavras -chave arbitrárias e usá -los em um dicionário.

Outras dicas

Será que Python está passando self automaticamente? Também sou novo no Python, então não tenho certeza de quando Python faz isso, mas isso causou alguma confusão para mim no passado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top