Urdro
Urdro

Reputation: 957

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

I having trouble passing a function as a parameter to another function. This is my 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()

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

When I run this: python manage.py updatestats I get the error:

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

I don't know what's causing this. I've tried converting it to a string, but I get the same error. Any ideas?

Full traceback:

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'

I used the shell to get the type of function output:

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

Upvotes: 61

Views: 586328

Answers (4)

cottontail
cottontail

Reputation: 23071

If you got this error, it means that your code got an unexpected input which probably means that there should be handled as an error or if it's a valid input, add/change code to account for it. One way is to iterate over this list and handle each element one-by-one. For example,

result = ['1', '2', '3']   # e.g. got this from some API
int(result)                # <--- TypeError
[int(x) for x in result]   # <--- no error

In the same vein, for example in the OP, since OP is using Google Analytics, the output of get_pageviews_query would look like:

results = {
    'columnHeaders': [{'name': 'ga:date'}, {'name': 'ga:pageviews'}], 
    'rows': [['20240205', 33], ['20240206', 20], ['20240207', 12]]
}

which is a nested list and contains page views of different days; so instead of getting only the first value in the list, it's probably desirable to iterate through this list and use all pageviews.

So a solution for OP (albeit 7 years too late) would be to change updatestats.py to account for this (valid) list input.

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)
                for _, pv in display_pageviews(hostname):        # <--- iterate over the list
                    stats = Stats.objects.update_or_create(
                        user=user,
                        views=pv,                                # <--- add each pageview value
                        visits=display_visits(hostname),
                        unique_visits=display_unique_visits(hostname),)
        except FieldError:
            print ('There was a field error.')

Upvotes: 0

Ali
Ali

Reputation: 11

integer_list = [int(item) for line in list for item in line]

In this way you can convert string to integer in a list

Upvotes: 1

mukesh yadav
mukesh yadav

Reputation: 53

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

According to the error, you can't convert strings type data into integers, So if a column contains null values as NaN then the type of NaN is float, so you can convert that into float.

check type of NaN -> type(np.NaN) ==> float

Upvotes: 1

Chris
Chris

Reputation: 22953

What the error is telling, is that you can't convert an entire list into an integer. You could get an index from the list and convert that into an integer:

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

If you're trying to convert a whole list into an integer, you are going to have to convert the list into a string first:

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

If your list elements are not strings, you'll have to convert them to strings before using str.join:

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

Also, as stated above, make sure that you're not returning a nested list.

Upvotes: 60

Related Questions