mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Issue #23671: string.Template now allows to specify the "self" parameter as
keyword argument. string.Formatter now allows to specify the "self" and the "format_string" parameters as keyword arguments.
This commit is contained in:
		
							parent
							
								
									be1eb14241
								
							
						
					
					
						commit
						8ffe917cee
					
				
					 4 changed files with 48 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -94,7 +94,11 @@ def _invalid(self, mo):
 | 
			
		|||
        raise ValueError('Invalid placeholder in string: line %d, col %d' %
 | 
			
		||||
                         (lineno, colno))
 | 
			
		||||
 | 
			
		||||
    def substitute(self, *args, **kws):
 | 
			
		||||
    def substitute(*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:
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +124,11 @@ def convert(mo):
 | 
			
		|||
                             self.pattern)
 | 
			
		||||
        return self.pattern.sub(convert, self.template)
 | 
			
		||||
 | 
			
		||||
    def safe_substitute(self, *args, **kws):
 | 
			
		||||
    def safe_substitute(*args, **kws):
 | 
			
		||||
        if not args:
 | 
			
		||||
            raise TypeError("descriptor 'safe_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:
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +168,19 @@ def convert(mo):
 | 
			
		|||
# The field name parser is implemented in _string.formatter_field_name_split
 | 
			
		||||
 | 
			
		||||
class Formatter:
 | 
			
		||||
    def format(self, format_string, *args, **kwargs):
 | 
			
		||||
    def format(*args, **kwargs):
 | 
			
		||||
        if not args:
 | 
			
		||||
            raise TypeError("descriptor 'format' of 'Formatter' object "
 | 
			
		||||
                            "needs an argument")
 | 
			
		||||
        self, *args = args  # allow the "self" keyword be passed
 | 
			
		||||
        try:
 | 
			
		||||
            format_string, *args = args # allow the "format_string" keyword be passed
 | 
			
		||||
        except ValueError:
 | 
			
		||||
            if 'format_string' in kwargs:
 | 
			
		||||
                format_string = kwargs.pop('format_string')
 | 
			
		||||
            else:
 | 
			
		||||
                raise TypeError("format() missing 1 required positional "
 | 
			
		||||
                                "argument: 'format_string'") from None
 | 
			
		||||
        return self.vformat(format_string, args, kwargs)
 | 
			
		||||
 | 
			
		||||
    def vformat(self, format_string, args, kwargs):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ def test_regular_templates(self):
 | 
			
		|||
        self.assertEqual(s.substitute(dict(who='tim', what='ham')),
 | 
			
		||||
                         'tim likes to eat a bag of ham worth $100')
 | 
			
		||||
        self.assertRaises(KeyError, s.substitute, dict(who='tim'))
 | 
			
		||||
        self.assertRaises(TypeError, Template.substitute)
 | 
			
		||||
 | 
			
		||||
    def test_regular_templates_with_braces(self):
 | 
			
		||||
        s = Template('$who likes ${what} for ${meal}')
 | 
			
		||||
| 
						 | 
				
			
			@ -198,6 +199,9 @@ def test_keyword_arguments(self):
 | 
			
		|||
        eq(s.substitute(dict(mapping='one'), mapping='two'),
 | 
			
		||||
           'the mapping is two')
 | 
			
		||||
 | 
			
		||||
        s = Template('the self is $self')
 | 
			
		||||
        eq(s.substitute(self='bozo'), 'the self is bozo')
 | 
			
		||||
 | 
			
		||||
    def test_keyword_arguments_safe(self):
 | 
			
		||||
        eq = self.assertEqual
 | 
			
		||||
        raises = self.assertRaises
 | 
			
		||||
| 
						 | 
				
			
			@ -216,6 +220,9 @@ def test_keyword_arguments_safe(self):
 | 
			
		|||
        raises(TypeError, s.substitute, d, {})
 | 
			
		||||
        raises(TypeError, s.safe_substitute, d, {})
 | 
			
		||||
 | 
			
		||||
        s = Template('the self is $self')
 | 
			
		||||
        eq(s.safe_substitute(self='bozo'), 'the self is bozo')
 | 
			
		||||
 | 
			
		||||
    def test_delimiter_override(self):
 | 
			
		||||
        eq = self.assertEqual
 | 
			
		||||
        raises = self.assertRaises
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,20 @@ def test_basic_formatter(self):
 | 
			
		|||
        self.assertEqual(fmt.format("foo"), "foo")
 | 
			
		||||
        self.assertEqual(fmt.format("foo{0}", "bar"), "foobar")
 | 
			
		||||
        self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6")
 | 
			
		||||
        self.assertRaises(TypeError, fmt.format)
 | 
			
		||||
        self.assertRaises(TypeError, string.Formatter.format)
 | 
			
		||||
 | 
			
		||||
    def test_format_keyword_arguments(self):
 | 
			
		||||
        fmt = string.Formatter()
 | 
			
		||||
        self.assertEqual(fmt.format("-{arg}-", arg='test'), '-test-')
 | 
			
		||||
        self.assertRaises(KeyError, fmt.format, "-{arg}-")
 | 
			
		||||
        self.assertEqual(fmt.format("-{self}-", self='test'), '-test-')
 | 
			
		||||
        self.assertRaises(KeyError, fmt.format, "-{self}-")
 | 
			
		||||
        self.assertEqual(fmt.format("-{format_string}-", format_string='test'),
 | 
			
		||||
                         '-test-')
 | 
			
		||||
        self.assertRaises(KeyError, fmt.format, "-{format_string}-")
 | 
			
		||||
        self.assertEqual(fmt.format(arg='test', format_string="-{arg}-"),
 | 
			
		||||
                         '-test-')
 | 
			
		||||
 | 
			
		||||
    def test_auto_numbering(self):
 | 
			
		||||
        fmt = string.Formatter()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,10 @@ Core and Builtins
 | 
			
		|||
Library
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
- Issue #23671: string.Template now allows to specify the "self" parameter as
 | 
			
		||||
  keyword argument.  string.Formatter now allows to specify the "self" and
 | 
			
		||||
  the "format_string" parameters as keyword arguments.
 | 
			
		||||
 | 
			
		||||
- Issue #21560: An attempt to write a data of wrong type no longer cause
 | 
			
		||||
  GzipFile corruption.  Original patch by Wolfgang Maier.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue