This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author rhettinger
Recipients
Date 2006-08-03.18:14:26
SpamBayes Score
Marked as misclassified
Message-id
In-reply-to
Content
Logged In: YES 
user_id=80475

The replacement of _multimap is a semantic change. 
Formerly, a dictionary passed in as a positional argument is
left unmolested; now, it is mutated to reflect kwds.   Also,
the _multimap setup is an O(1) step while the update()
approach is O(n).  Also, the current implementation only
requires the positional argument to support __getitem__();
now, it requires a more fully compliant duck (one that
provides an .update() method).

-            mapping = _multimap(kws, args[0])
+            mapping = args[0]
+            mapping.update(kws)

Current behavior:

>>> t = Template('the $speed brown')
>>> d = dict(speed='quick')
>>> t.safe_substitute(d, speed='slow')
'the slow brown'
>>> d
{'speed': 'quick'}

After the patch, it returns {'speed': 'slow'}.

Likewise the following now works, but would fail after the
patch:

>>> t = Template('the $speed brown')
>>> class D:
	def __getitem__(self, key):
		return 'quick'
>>> t.safe_substitute(D(), speed='slow')
'the slow brown'

The whole approach is misguided, and the use case itself is
suspect.  If some change is warranted, consider a cleaner,
more general-purpose solution like having an optional key=
argument to the Template constructor for pre-processing keys:

>>> t = Template('the $speed brown', key=str.lower)
History
Date User Action Args
2007-08-23 15:53:42adminlinkissue1528167 messages
2007-08-23 15:53:42admincreate