Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!eu.feeder.erje.net!xlned.com!feeder1.xlned.com!newsfeed.xs4all.nl!newsfeed4a.news.xs4all.nl!xs4all!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.022 X-Spam-Evidence: '*H*': 0.96; '*S*': 0.00; 'subject:Python': 0.06; 'attribute': 0.07; 'incompatible': 0.07; 'attributes': 0.09; 'cc:addr:python-list': 0.11; 'def': 0.12; '*always*': 0.16; '23,': 0.16; '42,': 0.16; 'brackets': 0.16; 'callable': 0.16; 'class:': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'interpreter,': 0.16; 'key):': 0.16; 'notation,': 0.16; 'notations': 0.16; 'typeerror:': 0.16; 'wrote:': 0.18; 'aug': 0.22; 'cc:addr:python.org': 0.22; 'cc:2**0': 0.24; "i've": 0.25; '15,': 0.26; 'header:In-Reply-To:1': 0.27; 'message- id:@mail.gmail.com': 0.30; 'getting': 0.31; '"",': 0.31; 'bunch': 0.31; 'convenience': 0.31; "d'aprano": 0.31; 'keys': 0.31; 'really,': 0.31; 'steven': 0.31; 'file': 0.32; 'class': 0.32; '(most': 0.33; 'skip:_ 10': 0.34; 'problem': 0.35; 'but': 0.35; 'received:google.com': 0.35; 'acceptable': 0.36; 'method': 0.36; 'two': 0.37; 'sometimes': 0.38; 'pm,': 0.38; 'little': 0.38; 'recent': 0.39; 'bad': 0.39; 'gone': 0.61; 'matter': 0.61; "you're": 0.61; 'land': 0.65; 'bag': 0.74; 'square': 0.74; 'subject:For': 0.78; '10:43': 0.84; 'asia.': 0.84; 'dict.': 0.84; 'horrible': 0.84; 'overloading': 0.84; 'subject:Make': 0.91; 'to:none': 0.92; 'imagine': 0.93 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:cc :content-type; bh=c8t4nUGYI82wtUK7XWQOxIHbGyWsKQ7tWg9lBBNek3s=; b=pw6d4wsJduYMiEaozcMhT3PHx5xjNqEi6tsZX/JIAhfR8OyyY5aLlgIrjvo3mXDiS1 b2ioGg9TjfIfWvKVDtt+ZetpdFgitTbXxAHbC/p9MW7DzzfYqfZLPb5n8JxZk5rn2DeY g9LI5+9AGDorqU4V68DHTVUJbHRRmWUmLyBv1Uq3YuQa7WVipn8/ZknHKXPiECugHYi3 Rz9jqkTlr+t1lDUrajR0KIiYaYURzJS8IfHC8wss2k3IIb4EijaupnI7aA1OV5tyR0XR A+ErxsV6TjwldVmJAqqVg0+/k3FyTEa9xG9sHX1We5/GEwfr0mIE4uGSzLyfilvs6zLk 0Ndg== MIME-Version: 1.0 X-Received: by 10.50.80.76 with SMTP id p12mr6797073igx.34.1407244114988; Tue, 05 Aug 2014 06:08:34 -0700 (PDT) In-Reply-To: <53e0d161$0$29979$c3e8da3$5496439d@news.astraweb.com> References: <7ef67ccc-3fc3-47dd-b858-09ef3b57a497@googlegroups.com> <87k36nxhv8.fsf@elektro.pacujo.net> <53e0d161$0$29979$c3e8da3$5496439d@news.astraweb.com> Date: Tue, 5 Aug 2014 23:08:34 +1000 Subject: Re: 3 Suggestions to Make Python Easier For Children From: Chris Angelico Cc: "python-list@python.org" Content-Type: text/plain; charset=UTF-8 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 36 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1407244119 news.xs4all.nl 2953 [2001:888:2000:d::a6]:33386 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:75737 On Tue, Aug 5, 2014 at 10:43 PM, Steven D'Aprano wrote: > Because it's horrible and a bad idea. > > d = {'this': 23, 'word': 42, 'frog': 2, 'copy': 15, 'lunch': 93} > e = d.copy() > > Traceback (most recent call last): > File "", line 1, in ? > TypeError: 'int' object is not callable > > > Conflating keys in a database with object attributes is one of the classic > blunders, like getting involved in a land war in Asia. It is, *maybe*, > barely acceptable as a quick-and-dirty convenience at the interactive > interpreter, in a Bunch or Bag class that has very little in the way of > methods or behaviour, but not acceptable for a class as fundamental and > important as dict. No matter what Javascript thinks. It's not fundamentally bad, just fundamentally incompatible with any other use of methods. Really, what you're pointing out isn't so much a problem with conflating keys and attributes as it is with using attributes for two purposes: key lookup, and method lookup. And that's *always* going to be a bad thing. Imagine this class: class BadDict(dict): def __getitem__(self, key): if key == 'copy': return self.copy return super().__getitem__(key) Now I've just gone the other way - overloading square brackets to sometimes mean key lookup, and sometimes attribute lookup. And it's the two meanings on one notation, not the two notations for one meaning, that's the bad idea. ChrisA