web-dev-qa-db-fra.com

L'argument TypeError: int () doit être une chaîne, un objet de type octet ou un nombre, et non pas 'list'

J'ai du mal à passer une fonction en tant que paramètre à une autre fonction. Ceci est mon code:

ga.py:

def display_pageviews(hostname):
    pageviews_results = get_pageviews_query(service, hostname).execute()
    if pageviews_results.get('rows', []):
        pv = pageviews_results.get('rows')
        return pv[0]
    else:
        return None


def get_pageviews_query(service, hostname):  
    return service.data().ga().get(
        ids=VIEW_ID,
        start_date='7daysAgo',
        end_date='today',
        metrics='ga:pageviews',
        sort='-ga:pageviews',
        filters='ga:hostname==%s' % hostname,)

models.py:

class Stats(models.Model):
    user = models.OneToOneField('auth.User')
    views = models.IntegerField()
    visits = models.IntegerField()
    unique_visits = models.IntegerField()

pdatestats.py:

class Command(BaseCommand):

    def handle(self, *args, **options):
        users = User.objects.all()
        try:
            for user in users:
                hostname = '%s.%s' % (user.username, settings.NETWORK_DOMAIN)
                stats = Stats.objects.update_or_create(
                    user=user,
                    views=display_pageviews(hostname),
                    visits=display_visits(hostname),
                    unique_visits=display_unique_visits(hostname),)
        except FieldError:
            print ('There was a field error.')

Quand je lance ceci: python manage.py updatestats Je reçois l'erreur:

L'argument TypeError: int () doit être une chaîne, un objet de type octet ou un nombre, et non pas 'list'

Je ne sais pas ce qui cause ça. J'ai essayé de le convertir en chaîne, mais j'obtiens la même erreur. Des idées?

Traceback complète:

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/Users/myusername/project/Dev/project_files/project/main/management/commands/updatestats.py", line 23, in handle
    unique_visits=display_unique_visits(hostname),)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/query.py", line 480, in update_or_create
    obj = self.get(**lookup)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/query.py", line 378, in get
    clone = self.filter(*args, **kwargs)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/query.py", line 790, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/query.py", line 808, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/sql/query.py", line 1243, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/sql/query.py", line 1269, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/sql/query.py", line 1203, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/sql/query.py", line 1099, in build_lookup
    return final_lookup(lhs, rhs)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/lookups.py", line 19, in __init__
    self.rhs = self.get_prep_lookup()
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/lookups.py", line 57, in get_prep_lookup
    return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/fields/__init__.py", line 1860, in get_prep_lookup
    return super(IntegerField, self).get_prep_lookup(lookup_type, value)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/fields/__init__.py", line 744, in get_prep_lookup
    return self.get_prep_value(value)
  File "/Users/myusername/project/Dev/lib/python3.4/site-packages/Django/db/models/fields/__init__.py", line 1854, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

Modifier:

D'accord, je comprends quel est le problème. J'ai utilisé le shell pour obtenir le type de sortie de fonction:

>>> type(display_pageviews('test.domain.com'))
<class 'list'>

J'ai essayé avec ça mais c'est toujours considéré comme une liste:

pv = pageviews_results.get('rows')[0]
    return pv
18
Urdro

Ce que l'erreur dit, c'est que vous ne pouvez pas convertir une liste entière en entier. Vous pouvez obtenir un index de la liste et le convertir en entier:

x = ["0", "1", "2"] 
y = int(x[0]) #accessing the zeroth element

Si vous essayez de convertir une liste entière en entier, vous devrez d'abord convertir la liste en chaîne:

x = ["0", "1", "2"]
y = ''.join(x) # converting list into string
z = int(y)

Si vos éléments de liste ne sont pas des chaînes, vous devrez les convertir en chaînes avant d'utiliser str.join:

x = [0, 1, 2]
y = ''.join(map(str, x))
z = int(y)

En outre, comme indiqué ci-dessus, veillez à ne pas renvoyer de liste imbriquée.

23
Christian Dean