TypeError: аргумент int () должен быть строкой, байтовым объектом или числом, а не списком

38

У меня возникли проблемы с передачей функции в качестве параметра другой функции. Это мой код:

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

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

Когда я запускаю это: python manage.py updatestatsя получаю сообщение об ошибке:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

Я не знаю, чем это вызвано. Я пробовал преобразовать его в строку, но получаю ту же ошибку. Любые идеи?

Полная трассировка:

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'

Редактировать:

Хорошо, я понимаю, в чем проблема. Я использовал оболочку, чтобы получить тип вывода функции:

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

Я пробовал с этим, но он все еще рассматривается как список:

pv = pageviews_results.get('rows')[0]
    return pv
4
  • Покажите, пожалуйста, полную трассировку. Помимо всего прочего, он сообщит нам, где именно возникла ошибка. 8 авг.
  • вы не можете преобразовать список в строку, как говорится 8 авг.
  • Убедитесь, что return pv[0]не дает вам список. 8 авг.
  • Я вижу ту же ошибку, за исключением того, что трассировки нет, поэтому я понятия не имею, где это происходит. Я уверен, что это в библиотеке. Что-то, должно быть, улавливает это, но это не имеет смысла. 4 апр '17 в 19:05
41

Ошибка говорит о том, что вы не можете преобразовать весь список в целое число. Вы можете получить индекс из списка и преобразовать его в целое число:

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

Если вы пытаетесь преобразовать весь список в целое число, вам придется сначала преобразовать список в строку:

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

Если элементы вашего списка не являются строками, вам придется преобразовать их в строки перед использованием str.join:

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

Кроме того, как указано выше, убедитесь, что вы не возвращаете вложенный список.

2
  • Но почему он этого не try exceptулавливает? 19 сен '18 в 9:40
  • 4
    @geoidesic, потому что except был только проинструктирован поймать FieldError. TypeErrorопущено. 31 янв.
0

Аргумент int () должен быть строкой, байтовым объектом или числом, а не NoneType.

В соответствии с ошибкой вы не можете преобразовать данные строкового типа в целые числа, поэтому, если столбец содержит нулевые значения как NaN, тогда тип NaN - float, поэтому вы можете преобразовать его в float.

проверить тип NaN -> type (np.NaN) ==> float