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'
Edit:
Alright, I understand what the issue is. I used the shell to get the type of function output:
>>> type(display_pageviews('test.domain.com')) <class 'list'>
I tried with this but it is still considered as a list:
pv = pageviews_results.get('rows')[0] return pv
The Python "TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'" occurs when we pass a list to the int() class. To solve the error, access a specific item in the list and pass the item to the int() class, e.g. int(my_list[0]) .
To convert a string to integer in Python, use the int() function. This function takes two parameters: the initial string and the optional base to represent the data. Use the syntax print(int("STR")) to return the str as an int , or integer.
Python TypeError: 'int' object is not subscriptableThis error occurs when you try to use the integer type value as an array. In simple terms, this error occurs when your program has a variable that is treated as an array by your function, but actually, that variable is an integer.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With