假设我有一个数据类:
@dataclass(frozen=True)
class Foo:
id: str
name: str
Run Code Online (Sandbox Code Playgroud)
我希望它是不可变的(因此是frozen=True),这样foo.id = bar就会foo.name = baz失败。但是,我希望能够删除 id,如下所示:
foo = Foo(id=10, name="spam")
foo.strip_id()
foo
-> Foo(id=None, name="spam")
Run Code Online (Sandbox Code Playgroud)
我尝试了一些方法,覆盖setattr,但没有任何效果。有一个优雅的解决方案吗?(我知道我可以编写一个方法,返回一个新的冻结实例,该实例是相同的,只是该 id 已被删除,但这似乎有点 hacky,并且它需要我这样做foo = foo.strip_id(),因为foo.strip_id()实际上不会改变foo)
编辑:
尽管一些评论者似乎不同意,但我认为“完全可变,用它做你想做的事”和“不可变,除非以这种特殊的、严格控制的方式”之间存在合理的区别
芹菜版本号:4.4.5
我有一个像这样装饰的函数:
@app.task(bind=True, retry_backoff=5, retry_jitter=False, retry_kwargs={"max_retries": 5})
def foo(self):
try:
#work
except Exception:
try:
_log.info(retrying task)
self.retry()
except MaxRetriesExceeded:
_log.error(Permanent failure)
Run Code Online (Sandbox Code Playgroud)
我希望在 5 秒后重试,然后在 10 秒后重试,然后在 20 秒后重试,然后在 40 秒后重试,然后在 80 秒后重试。
相反,celery 会记录“180 秒后重试任务”,它确实这样做了。然后,它重复相同的过程两次,总共重试三次,然后放弃。
从我在文档中读到的内容来看,这似乎是正确的方法。难道我做错了什么?
我编写了一个旨在压平 json 的函数。该函数以递归方式工作 - 如果键、值对的值不是json,则返回键、值对,否则,对该值再次调用该函数:
def flatten_json(j):
for k, v in j.items():
if isinstance(v, dict):
flatten_json(v)
else:
yield (k,v)
flat_json = {x[0]: x[1] for x in flatten_json(j)}
Run Code Online (Sandbox Code Playgroud)
这个想法是,每当函数yield出现元组时,它就会被收集到 flat_json 字典中。按照目前的情况,嵌套输出将被忽略 - 只有顶级键、值对出现在 flat_json 中。
为了与 slack 交互,服务器需要能够基于某种加密散列验证请求。如果此检查返回 false,则服务器应以 400 响应。将其作为 mixin 执行此操作似乎是明智的:
class SlackValidationMixin:
def dispatch(self, request, *args, **kwargs):
if validate_slack_request(request):
return super().dispatch(request, *args, **kwargs)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
这给出了错误“accepted_renderer not set on Response”基于一个SO问题,我添加了以下内容:
class SlackValidationMixin:
def dispatch(self, request, *args, **kwargs):
if validate_slack_request(request):
return super().dispatch(request, *args, **kwargs)
else:
response = Response(status=status.HTTP_400_BAD_REQUEST)
response.accepted_renderer = JSONRenderer
response.accepted_media_type = "application/json"
response.renderer_context = {}
return response
Run Code Online (Sandbox Code Playgroud)
但这给出了错误: AttributeError: 'NoneType' object has no attribute 'get_indent'
为什么它需要一个accepted_renderer,因为它只响应一个HTTP 状态代码,没有额外的数据?解决这个问题的最简单方法是什么?
以下建议使 EmptyResponse 对象从 Response 继承:
Traceback (most recent call last):
File "path/lib/python3.8/site-packages/django/core/handlers/exception.py", line …Run Code Online (Sandbox Code Playgroud)