2013-02-21 18 views
2

因此,在简单讨论关于why not to use locals的#python之后,我在思考什么是没有重复性质的更好方法非DRY)的dict(foo=foo,bar=bar)(或使用文字语法({}))相同)。比当地人()或字典(foo = foo)更好的将上下文导出到模板引擎

理想情况下,可以提交反映this ecmascript harmony proposal的PEP(或已存在的PEP)。 (我想强调它传达的DRY方面)。

那么,你有任何解决方案吗?我应该提交一份PEP吗?

+0

好问题 - 虽然,不适合堆栈溢出,因为这是真的是一个讨论的邀请。这在Python邮件列表上会更好。 – 2013-02-22 03:37:40

+0

而且,我更愿意放弃 - 这里是关于可用[Python邮件列表](http://python.org/community/lists/)的信息。 – 2013-02-22 03:47:24

+0

是的,就Web内容而言,SO只是更容易访问 - 当搜索结果出现时,您不必摸索档案就能找到答案。谢谢,我一定会在邮件列表上提问。 – forivall 2013-02-22 06:50:42

回答

0

我目前提出的解决方案是以下模式。请告诉我,这是否与使用locals()时一样糟糕。

class _Context: 
    foo = 'bar' 
render(request, 'example.html', vars(_Context)) 

一个需要注意的是,这可能与python3有点玄乎,因为它会使用新的样式类与不变dictproxy,而我需要看看它是如何与给定的模板库进行交互。使用简单的'{foo}'.format(**_Context.__dict__)可以很好地工作。

明显改善了locals(),因为它非常明确,并且不会泄漏本地范围的其他部分。然而,它确实泄漏了'__module__''__doc__'旧风格的类和一些其他的东西与新风格的类。

+0

这个或'__dict__'很好!被问到比我更pythonic的人。 – forivall 2015-09-13 02:00:07

0

这是我的解决方案。有可能有更好的方法来构建这个,但它的工作原理!

设置(Python 2和3):

class ContextDictBase(type): 
    @staticmethod 
    def __newnew(cls, name, bases, attrs): 
     attrs.pop('__module__', None) 
     return attrs 
    def __new__(cls, name, bases, attrs): 
     ContextDictBase.__new__ = staticmethod(ContextDictBase.__newnew) 
     return super(ContextDictBase, cls).__new__(cls, name, bases, attrs) 

的Python 2:

class ContextDict(object): 
    __metaclass__ = ContextDictBase 

的Python 3:

class ContextDict(object, metaclass=ContextDictBase): 
    pass 

然后使用它:

class context(ContextDict): 
    a = 1 
    b = 2 

>>> context 
{'a': 1, 'b': 2} 
0

而且在元类/ ATTRS解决方案的变化:

def make_dict(name, bases, attrs): 
    attrs.pop('__module__') 
    attrs.pop('__metaclass__', None) # not needed in python3 
    return attrs 

的Python 2:

class Context: 
    __metaclass__ = make_dict 

的Python 3:

class Context(metaclass=make_dict): 
    a = 1 
    b = 2 

真的,这个问题才刚刚变成了我的沙箱玩metaclasses

相关问题