因此,在简单讨论关于why not to use locals的#python之后,我在思考什么是没有重复性质的更好方法非DRY)的dict(foo=foo,bar=bar)
(或使用文字语法({}
))相同)。比当地人()或字典(foo = foo)更好的将上下文导出到模板引擎
理想情况下,可以提交反映this ecmascript harmony proposal的PEP(或已存在的PEP)。 (我想强调它传达的DRY方面)。
那么,你有任何解决方案吗?我应该提交一份PEP吗?
因此,在简单讨论关于why not to use locals的#python之后,我在思考什么是没有重复性质的更好方法非DRY)的dict(foo=foo,bar=bar)
(或使用文字语法({}
))相同)。比当地人()或字典(foo = foo)更好的将上下文导出到模板引擎
理想情况下,可以提交反映this ecmascript harmony proposal的PEP(或已存在的PEP)。 (我想强调它传达的DRY方面)。
那么,你有任何解决方案吗?我应该提交一份PEP吗?
我目前提出的解决方案是以下模式。请告诉我,这是否与使用locals()
时一样糟糕。
class _Context:
foo = 'bar'
render(request, 'example.html', vars(_Context))
一个需要注意的是,这可能与python3有点玄乎,因为它会使用新的样式类与不变dictproxy
,而我需要看看它是如何与给定的模板库进行交互。使用简单的'{foo}'.format(**_Context.__dict__)
可以很好地工作。
它是明显改善了locals()
,因为它非常明确,并且不会泄漏本地范围的其他部分。然而,它确实泄漏了'__module__'
和'__doc__'
旧风格的类和一些其他的东西与新风格的类。
这个或'__dict__'很好!被问到比我更pythonic的人。 – forivall 2015-09-13 02:00:07
这是我的解决方案。有可能有更好的方法来构建这个,但它的工作原理!
设置(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}
而且在元类/ 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
好问题 - 虽然,不适合堆栈溢出,因为这是真的是一个讨论的邀请。这在Python邮件列表上会更好。 – 2013-02-22 03:37:40
而且,我更愿意放弃 - 这里是关于可用[Python邮件列表](http://python.org/community/lists/)的信息。 – 2013-02-22 03:47:24
是的,就Web内容而言,SO只是更容易访问 - 当搜索结果出现时,您不必摸索档案就能找到答案。谢谢,我一定会在邮件列表上提问。 – forivall 2013-02-22 06:50:42