python - 属性错误:“dict”对象没有属性“endswith”
问题描述
(y) xlm@d8cb8a102c73:~/workspace/y-server/y$ ./manage.py
run_algorithm --settings=y.settings.local
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/__init__.py", line 354, in
execute_from_command_line
utility.execute()
File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/base.py", line 454, in execute
self.stdout.write(output)
File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/base.py", line 111, in write
if ending and not msg.endswith(ending):
AttributeError: 'dict' object has no attribute 'endswith'
我正在尝试在 django 框架上使用命令文件 run_algorithm.py(如下)运行文件 algorithm.py。但是我得到了上述属性错误,我不确定为什么。
import logging
from django.conf import settings
from django.core.management.base import BaseCommand
from ...algorithm import engagement_level_mapping
logger = logging.getLogger(settings.LOGGER_NAME)
class Command(BaseCommand):
help = "TODO: describe"
def handle(self, *args, **options):
result = engagement_level_mapping()
return result
但是,当打印结果时,文件会正确执行,而不是返回。
import logging
from django.conf import settings
from django.core.management.base import BaseCommand
from ...algorithm import engagement_level_mapping
logger = logging.getLogger(settings.LOGGER_NAME)
class Command(BaseCommand):
help = "TODO: describe"
def handle(self, *args, **options):
result = engagement_level_mapping()
print(result)
命令文件为每个用户打印一个参与度值的字典(不是那么相关,只是它打印一个字典)。
这是base.py中的代码
解决方案
您收到此错误是因为 django 管理命令的handle()
方法不应该返回任何内容,而是返回字符串 - 如果您阅读回溯,您很容易发现错误发生在基类中(在 django/core/management/base.pydjango/ core/management/base.py),它试图打印出你的命令返回的值。
关键是从管理命令返回任何其他内容是没有意义的:管理命令是一个命令行工具,并且预期会产生副作用(修改数据库/文件系统/等中的某些内容)或生成一些可以显示或馈送到另一个命令行程序的文本输出(在 unix 传统中,您将命令连接在一起)。
修复很明显:在返回结果之前将结果格式化为字符串,即(使用 json 输出的示例,但您可以选择生成 csv 或 xml 或任何适合您的内容):
import json
class Command(BaseCommand):
help = "TODO: describe"
def handle(self, *args, **options):
result = engagement_level_mapping()
return json.dumps(result, indent=2)
推荐阅读
- python - 如何将熊猫系列的列值转换为Python中的列表?
- conditional-statements - 如何在火花流中删除其他结果?
- laravel - Laravel:调用自定义外观的问题
- java - 如何获取 TypeLiteral 绑定或可以说来自注入器的实例 [Google Guice]
- android-studio - 如何水平定义 RadioListTitles?
- javascript - 强制 Pixi.js WebGl 始终使用新的画布来解决在没有清除浏览器缓存的情况下重新加载页面后出现的错误
- powershell - 如何使用 PowerShell 关闭计算机?
- go - 预提交打印'golint:找不到命令'
- python - 每次使用 python 抓取时保存 excel
- java - 我不断收到错误 java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageView cannot be cast to android.widget.TextView