Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子类化模板以提供默认参数_Python_Python 3.x_Templates_Subclass - Fatal编程技术网

Python 子类化模板以提供默认参数

Python 子类化模板以提供默认参数,python,python-3.x,templates,subclass,Python,Python 3.x,Templates,Subclass,我正在从string子类化Template,为它提供一些额外的默认功能。其思想是将其查找范围从传递的dict扩展到locals(),然后扩展到globals(),最后扩展到默认值(例如,扩展到“-”)。这就是我写的: class MyTemplate(Template): def substitute_default(*args, **kws): if not args: raise TypeError("descriptor 'substitut

我正在从
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)
果汁的生产线是这样的:


我正在这样测试它:

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()
查找不能工作

  • 有人知道为什么会这样吗
  • 有更好的方法吗

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

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

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