小编ale*_*ord的帖子

Python 冻结数据类,允许通过方法更改属性

假设我有一个数据类:

@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

编辑:

尽管一些评论者似乎不同意,但我认为“完全可变,用它做你想做的事”和“不可变,除非以这种特殊的、严格控制的方式”之间存在合理的区别

python python-dataclasses

8
推荐指数
2
解决办法
1万
查看次数

Celery 忽略 retry_backoff,而是重复重试 180 秒

芹菜版本号: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 秒后重试任务”,它确实这样做了。然后,它重复相同的过程两次,总共重试三次,然后放弃。

从我在文档中读到的内容来看,这似乎是正确的方法。难道我做错了什么?

python celery django-celery

3
推荐指数
1
解决办法
1691
查看次数

Python - 收集递归函数的输出

我编写了一个旨在压平 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 中。

python recursion

2
推荐指数
1
解决办法
905
查看次数

Django Rest Framework:从 mixin 的 dispatch 方法返回响应

为了与 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)

django dispatch django-rest-framework django-drf-renderer

2
推荐指数
1
解决办法
1020
查看次数