#33295 closed Bug (wontfix)
AttributeError is raised when a list is passed into self.stdout.write().
| Reported by: | Vishal Pandey | Owned by: | Vishal Pandey |
|---|---|---|---|
| Component: | Core (Management commands) | Version: | 3.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | yes | UI/UX: | no |
Description (last modified by )
We pretty much know and understand that only a string could be passed in self.stdout.write function
Just in case if we pass a list into it, like the below piece of code:
class Command(BaseCommand):
def handle(self, *args, **kwargs):
self.stdout.write([1,2,3])
It throws an Attribute error stating that list' object has no attribute 'endswith', it is because the datatype of msg is not checked in handle function while writing write method in Outputwrapper class.
Here is the full traceback of the error
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/vishal/Desktop/open_source/leetcode_companywise/questions/management/commands/addcompanies.py", line 18, in handle
self.stdout.write([1,2,3])
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 144, in write
if ending and not msg.endswith(ending):
AttributeError: 'list' object has no attribute 'endswith'
It can be fixed if we just ensure the datatype of the msg is string and handle it accordingly with
isinstance(msg, str)
in line 151 of /django/core/management/base.py.
After handling this error a proper error message(i.e. TypeError) will be shown on the terminal of the user which is more appropriate in this situation.
New traceback:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/vishal/Desktop/open_source/leetcode_companywise/questions/management/commands/addcompanies.py", line 18, in handle
self.stdout.write([1,2,3])
File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 147, in write
self._out.write(style_func(msg))
TypeError: write() argument must be str, not list
Attachments (1)
Change History (5)
by , 4 years ago
| Attachment: | Screenshot from 2021-11-17 15-46-51.png added |
|---|
comment:1 by , 4 years ago
| Owner: | changed from to |
|---|
comment:2 by , 4 years ago
| Description: | modified (diff) |
|---|
comment:3 by , 4 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | assigned → closed |
I don't think it worth fixing, there are many methods and functions in Django that assume that the expected arguments are passed. It's not worth adding isinstance() check to most of them.
comment:4 by , 4 years ago
| Summary: | Django throws an error when a list is passed into self.stdout.write for writing message into the terminal → AttributeError is raised when a list is passed into self.stdout.write(). |
|---|
First traceback is the current output and second traceback is the new output after handling the bug