New submission from Terry J. Reedy <tjre...@udel.edu>:

In 2.6, the requirement for **kwds keyword argument expansion in calls (LangRef 
5.3.4. Calls) is relaxed from "(subclass of) dictionary" (2.5) to "mapping".  
The requirement in this context for 'mapping' is not specified. LRef3.2 merely 
says "The subscript notation a[k]  selects the item indexed by k from the 
mapping a;". Here, .keys seems to be needed in addition to .__getitem__. 
(.items alone does not make an object a mapping.)

In python-list thread "Which objects are expanded by double-star ** operator?", 
Peter Otten posted 2.6 results for

class A(object):
     def keys(self): return list("ab")
     def __getitem__(self, key):
         return 42
        
class B(dict):
     def keys(self): return list("ab")
     def __getitem__(self, key):
         return 42

def f(**kw):
     print(kw)

f(**A())
# {'a': 42, 'b': 42}

b = B(); print(b['a'], b['b']) # I added this
# 42, 42
f(**b)
# {}

I get same with 3.1. It appears .keys() is called in the first case, but not 
the second, possibly due to an internal optimization.

The different of outcome seems like a bug, though one could argue that the doc 
is so vague that it makes no promise to be broken.

----------
components: Interpreter Core
messages: 107338
nosy: tjreedy
priority: normal
severity: normal
status: open
title: Bug in **kwds expansion on call?
type: behavior
versions: Python 2.6, Python 2.7, Python 3.1, Python 3.2

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue8945>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to