2

因此,在对#python 进行了关于为什么不使用 locals的简短讨论之后,我正在思考什么是没有重复性(即不是 DRY)dict(foo=foo,bar=bar)(或使用文字语法({})相同)的更好方法。

理想情况下,可以提交(或已经存在)反映此 ecmascript 和谐提案的 PEP 。(我想强调它所传达的 DRY 方面)。

那么,你有什么解决办法吗?我应该提交 PEP 吗?

4

3 回答 3

0

以及元类/属性解决方案的变体:

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

真的,这个问题刚刚变成了我玩元类的沙盒

于 2013-03-28T17:58:03.610 回答
0

我目前提出的解决方案是以下模式。请告诉我这是否与使用locals().

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

需要注意的是,这对于 python3 可能有点不确定,因为它将使用带有 immutable 的新型类dictproxy,我需要看看它如何与给定的模板库交互。与简单的'{foo}'.format(**_Context.__dict__).

对 的明确改进locals(),因为它相当明确,并且不会泄漏本地范围的其他部分。但是,它确实会泄漏,并且会泄漏'__module__''__doc__'样式类以及许多其他带有新样式类的东西。

于 2013-02-21T23:17:04.460 回答
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)

蟒蛇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}
于 2013-02-22T18:53:34.573 回答