因此,在对#python 进行了关于为什么不使用 locals的简短讨论之后,我正在思考什么是没有重复性(即不是 DRY)dict(foo=foo,bar=bar)
(或使用文字语法({}
)相同)的更好方法。
理想情况下,可以提交(或已经存在)反映此 ecmascript 和谐提案的 PEP 。(我想强调它所传达的 DRY 方面)。
那么,你有什么解决办法吗?我应该提交 PEP 吗?
因此,在对#python 进行了关于为什么不使用 locals的简短讨论之后,我正在思考什么是没有重复性(即不是 DRY)dict(foo=foo,bar=bar)
(或使用文字语法({}
)相同)的更好方法。
理想情况下,可以提交(或已经存在)反映此 ecmascript 和谐提案的 PEP 。(我想强调它所传达的 DRY 方面)。
那么,你有什么解决办法吗?我应该提交 PEP 吗?
以及元类/属性解决方案的变体:
def make_dict(name, bases, attrs):
attrs.pop('__module__')
attrs.pop('__metaclass__', None) # not needed in python3
return attrs
蟒蛇2:
class Context:
__metaclass__ = make_dict
蟒蛇 3:
class Context(metaclass=make_dict):
a = 1
b = 2
真的,这个问题刚刚变成了我玩元类的沙盒
我目前提出的解决方案是以下模式。请告诉我这是否与使用locals()
.
class _Context:
foo = 'bar'
render(request, 'example.html', vars(_Context))
需要注意的是,这对于 python3 可能有点不确定,因为它将使用带有 immutable 的新型类dictproxy
,我需要看看它如何与给定的模板库交互。与简单的'{foo}'.format(**_Context.__dict__)
.
这是对 的明确改进locals()
,因为它相当明确,并且不会泄漏本地范围的其他部分。但是,它确实会泄漏,并且会泄漏'__module__'
旧'__doc__'
样式类以及许多其他带有新样式类的东西。
这是我的解决方案。可能有更好的方法来构建它,但它确实有效!
设置(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)
蟒蛇2:
class ContextDict(object):
__metaclass__ = ContextDictBase
蟒蛇 3:
class ContextDict(object, metaclass=ContextDictBase):
pass
然后使用它:
class context(ContextDict):
a = 1
b = 2
>>> context
{'a': 1, 'b': 2}