Question

I am attempting to write a command line script that works with Organization Units within our Google Apps domain. Therefore, using the many convoluted documentation from Google on this, I have successfully created the application in the API Console, turned on Admin SDK, and have successfully connected within my script. However, when I create the directory service object (which seems to be successful) I am having issues interacting with it because I receive that message. I HAVE installed the Python API package as well. Here is my current code:

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

When I run that code I receive the error message:

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

I tried without using the "my_customer" alias, but then the error complains that I haven't provided it. Any help would be appreciated, I haven't use Python in a very long time; it very well may be user error.

Was it helpful?

Solution

I'm not familiar with the google apps API, but it appears that

orgunits.list() is defined like:

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

So if I run these commands:

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

So next time you see the error, try adding the parameter name to your arguments list and see if that resolves your issue.

More information:

The dictionary unpack operator (**) doesn't act like a normal argument in a parameter list. If you pass a positional argument, when this is the only argument in the list, then it will throw an error (like you saw) because the code is expecting a keyword argument instead.

The unpack operator can accept arbitrary keyword arguments and use them in a dictionary.

OTHER TIPS

Could it be that Python is passing self automatically? I'm also kind of new to Python, so I'm not sure when Python does that, but it's caused some confusion for me in the past.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top