【问题标题】:Subclassing Template to provide default arguments子类化模板以提供默认参数
【发布时间】:2019-04-24 09:40:51
【问题描述】:

我从string 继承Template 以赋予它一些额外的默认功能。这个想法是它的查找首先扩展到传递的dict之外到locals(),然后到globals(),最后是默认值(例如,到'-')。所以这就是我写的:

class MyTemplate(Template):
    def substitute_default(*args, **kws):
        if not args:
            raise TypeError("descriptor 'substitute' of 'Template' object needs an argument")
        self, *args = args  # allow the "self" keyword be passed
        if len(args) > 1:
            raise TypeError('Too many positional arguments')
        if not args:
            mapping = kws
        elif kws:
            mapping = ChainMap(kws, args[0])
        else:
            mapping = args[0]

        def convert(mo):
            named = mo.group('named') or mo.group('braced')
            if named is not None:
                val = mapping.get(named, locals().get(named, globals().get(named, '-')))
                return '%s' % (val,)
            if mo.group('escaped') is not None:
                return self.delimiter
            if mo.group('invalid') is not None:
                self._invalid(mo)
            raise ValueError('Unrecognized named group in pattern', self.pattern)

        return self.pattern.sub(convert, self.template)

的那一行是这样的:

val = mapping.get(named, locals().get(named, globals().get(named, '-')))

我正在这样测试它:

a = 'global_foo'

def f():
    b = 'local_foo'
    t = MyTemplate('''a=$a, b=$b, c=$c, d=$d''')
    text = t.substitute_default({'c': 'foo', 'd': 'bar'})
    print(text)

f()  # -> a=global_foo, b=-, c=foo, d=bar

如您所见,globals() 查找有效,但 locals() 无效..

  • 有人知道为什么会出现这种情况吗?
  • 有更好的方法吗?

【问题讨论】:

    标签: python python-3.x templates subclass


    【解决方案1】:

    问题是locals() 是您的convert 函数的本地函数,而您希望它引用f 本地函数。

    您必须以某种方式传递locals() 字典,无论是在构造函数中还是在其他地方,它才能工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2016-11-09
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多