小编And*_*eev的帖子

使用上下文管理器作为函数

我想创建一个函数,如果用with语句调用它也可以充当上下文管理器。示例用法是:

# Use as function    
set_active_language("en")

# Use as context manager
with set_active_language("en"):
    ...
Run Code Online (Sandbox Code Playgroud)

这与标准函数open的使用方式非常相似。

这是我想出的解决方案:

active_language = None  # global variable to store active language

class set_active_language(object):

    def __init__(self, language):
        global active_language
        self.previous_language = active_language
        active_language = language

    def __enter__(self):
        pass

    def __exit__(self, *args):
        global active_language
        active_language = self.previous_language
Run Code Online (Sandbox Code Playgroud)

这段代码不是线程安全的,但这与问题无关。

我不喜欢这个解决方案的一点是,类构造函数伪装成一个简单的函数,仅用于它的副作用。

有一个更好的方法吗?

请注意,我尚未测试此解决方案。

更新:我不想将函数和上下文管理器拆分为单独的实体的原因是命名。函数和上下文管理器基本上做同样的事情,所以对两者使用一个名称似乎是合理的。如果我想将它分开,命名上下文处理器将是有问题的。应该是什么?active_language? 该名称可能(并且将会)与变量名称发生冲突。override_active_language不过可能有用。

python

7
推荐指数
1
解决办法
1723
查看次数

你如何将Django的SelectDateWidget的顺序改为日,月,年?

这是形式:

from django.forms.extras.widgets import SelectDateWidget


class EntryForm(forms.ModelForm):

    class Meta():
        model = Entry

    def __init__(self, *args, **kwargs):
        super(EntryForm, self).__init__(*args, **kwargs)
        this_year = datetime.date.today().year
        years = range(this_year-100, this_year+1)
        years.reverse()
        self.fields["date_of_birth"].widget = SelectDateWidget(years=years)
Run Code Online (Sandbox Code Playgroud)

出生日期字段就是这样呈现的

在此输入图像描述

如何更改它以使其呈现为日,月,年?

django django-forms

5
推荐指数
1
解决办法
2262
查看次数

标签 统计

django ×1

django-forms ×1

python ×1