Path: csiph.com!usenet.pasdenom.info!aioe.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed2.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.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'python,': 0.02; 'operator': 0.03; 'syntax': 0.03; 'subject:Python': 0.05; 'reject': 0.05; '21,': 0.07; 'api': 0.09; 'python': 0.09; 'methods,': 0.09; 'surrounded': 0.09; 'url:github': 0.09; 'will,': 0.09; 'dec': 0.15; "skip:' 30": 0.15; 'api,': 0.16; 'cheap,': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'means:': 0.16; 'operators,': 0.16; 'parentheses': 0.16; 'parentheses:': 0.16; 'pythonic': 0.16; 'syntax,': 0.16; 'verbose': 0.16; 'version;': 0.16; 'string': 0.17; 'wrote:': 0.17; 'instance,': 0.17; 'ideal': 0.20; 'proposed': 0.20; 'bit': 0.21; 'doc': 0.22; 'parse': 0.22; 'defined': 0.22; 'example': 0.23; 'nearly': 0.23; "python's": 0.23; 'this:': 0.23; 'thus': 0.24; 'idea': 0.24; 'least': 0.25; 'header:In-Reply-To:1': 0.25; 'creating': 0.26; 'tree': 0.27; 'message-id:@mail.gmail.com': 0.27; 'received:209.85.212': 0.28; 'concise': 0.29; 'dom': 0.29; 'wrap': 0.29; 'fri,': 0.30; 'expect': 0.31; 'code': 0.31; 'structure': 0.32; 'could': 0.32; 'to:addr:python-list': 0.33; 'skip:d 20': 0.34; 'received:google.com': 0.34; 'self': 0.34; 'wrong': 0.34; 'returning': 0.35; 'skip:. 20': 0.35; 'pm,': 0.35; 'received:209.85': 0.35; 'something': 0.35; 'list.': 0.35; 'except': 0.36; 'explain': 0.36; 'but': 0.36; 'totally': 0.36; 'method': 0.36; 'bad': 0.37; 'does': 0.37; 'quite': 0.37; 'received:209': 0.37; 'subject:: ': 0.38; 'to:addr:python.org': 0.39; 'easily': 0.39; 'header:Received:5': 0.40; 'your': 0.60; 'skip:u 10': 0.60; 'kind': 0.61; 'world': 0.63; 'more': 0.63; 'sum': 0.66; 'taxes': 0.71; 'children.': 0.75; 'url:master': 0.84; 'wait,': 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:to :content-type; bh=u1ewt13gvyUp05XzVfh5QQqkmovKEi3PwkGFfRhUUfA=; b=1HEit/YxBxeN6/Bq/dKp4ZcdcvmJ6yGehUcMrNvxRCL4ttxupOixlJ6wIYnQVfBpCC 832KlvdDK2g+OO6XfUZDT9Swfxyl8Q+5CPgp7vGLcDxXsYnntc2lJ1zRLuuxDziPIe8K 1Bsz4/+DgI9dxT4hu4j0NnnEES7V3HtjB9dzsVDPRILK/gwO7Ty5d8CDVAr67j43ND59 uexCflgsHoCQyFHJanWeFO0A1nXD0T92DTb/YaYkhvHoL3hNFBwLebhsmZl2m9aMLnI6 21hsJFWN1Ja92tDk+vTJx3ILcLLmiSJ+cxl+5YaVWRATpWAIpRNgne7B66JQl60YuHr8 4Gdw== MIME-Version: 1.0 In-Reply-To: References: <50D256B3.4070709@udel.edu> <96edb672-dabd-4ab8-9e7c-3fa7f4a91437@googlegroups.com> Date: Fri, 21 Dec 2012 23:57:58 +1100 Subject: Re: Brython - Python in the browser From: Chris Angelico To: python-list@python.org Content-Type: text/plain; charset=ISO-8859-1 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: 54 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1356094682 news.xs4all.nl 6953 [2001:888:2000:d::a6]:45389 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:35287 On Fri, Dec 21, 2012 at 11:38 PM, Pierre Quentel wrote: > With the tree syntax proposed in Brython it would just be > > doc <= DIV('hello '+B('world')) > > If "pythonic" means concise and readable, which one is more pythonic ? Pythonic also means: If the implementation is hard to explain, it's a bad idea. What, exactly, does the sum of a string and a bolded string produce? Can you explain that easily and clearly? Don't forget that humans, as well as machines, will expect to be able to parse what's inside the parentheses without looking outside them. The DOM structure is, undeniably, quite verbose. But you could go for something with the same tree structure while a lot less wordy by simply returning self from lots of methods, thus allowing method chaining - something like this: https://github.com/Rosuav/Gypsum/blob/master/window.pike#L247 Note how the tree structure is defined by the parentheses, with ->add(...) calls creating children. (That's Pike, not Python, as I don't have a good Python example handy. The -> operator does more or less what Python's . does.) Now, I can conceive of a kind of API - an ideal API, the creature of my fancy, you know - which would be totally unobjectionable. An API, for instance, which would abolish taxes and make everything cheap, except gondolas... oh wait, wrong mailing list. To produce the HTML code
hello world
you might use: doc.add(Tag('DIV').add('hello ').add(Tag('B').add('world'))) And you can easily wrap that to suit, since it's surrounded by parentheses: doc.add( Tag('DIV') .add('hello ') .add(Tag('B').add('world')) ) There's no magic with operators, just simple method chaining. It's a bit more verbose than your proposed tree syntax, but not nearly as bad as the JS version; and it's not magical. Reject the idea if you will, but do at least please consider it :) ChrisA