Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!eu.feeder.erje.net!newsfeed.fsmpi.rwth-aachen.de!news-1.dfn.de!news.dfn.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Duncan Booth Newsgroups: comp.lang.python Subject: Re: eval [was Re: dict to boolean expression, how to?] Date: 5 Aug 2014 11:57:55 GMT Lines: 56 Message-ID: References: <53db8bd8$0$2976$e4fe514c@news2.news.xs4all.nl> <53dba39e$0$2976$e4fe514c@news2.news.xs4all.nl> <53dc5407$0$29986$c3e8da3$5496439d@news.astraweb.com> Reply-To: duncan.booth@suttoncourtenay.org.uk Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: individual.net r55xq/4xFp9QdjbKkpPvTAA2sqWgAWq6l4G6Rpmym6coHqwm6Y Cancel-Lock: sha1:qfJoOTrThEZVnyXRzXiAMQeoRLE= User-Agent: Xnews/2006.08.24 Hamster/2.1.0.11 X-Face: .C;/v3#w@2k.C(.1v-}d=`|7AQ-%,#A$0ZGtAkLPvuawAM>3#D,pXaAb31%(=Gn2ZZK/Z~fd0y4't5iKK~F":}F2*|\mQYX+BUr4ZM*|+`@o-TKzFGwsJnan{)*b~QJ-Fu^u'$$nYV Xref: csiph.com comp.lang.python:75727 Steven D'Aprano wrote: > Consider the namedtuple implementation in the standard library. > There's a lot of criticism of it, some of it justified. It uses exec > extensively, which means the code is dominated by a giant string > template. This defeats your editor's syntax colouring, makes > refactoring harder, and makes how the namedtuple works rather less > understandable. It seems to me that it's only generating the __new__ > method which genuinely needs to use exec, the rest of the namedtuple > could and should use just an ordinary class object (although I concede > that some of this is just a matter of personal taste). > > Raymond Hettinger's original, using exec for the entire inner class: > > http://code.activestate.com/recipes/500261-named-tuples/ > > > My refactoring, with the bare minimum use of exec necessary: > > https://code.activestate.com/recipes/578918-yet-another-namedtuple/ This may be a silly question, but what would stop you moving the exec inside the class? So: ns = {'_new': tuple.__new__} class Inner(tuple): # Work around for annoyance: type __doc__ is read-only :-( __doc__ = ("%(typename)s(%(argtxt)s)" % {'typename': typename, 'argtxt': argtxt}) __slots__ = () _fields = field_names exec """def __new__(_cls, %(argtxt)s): return _new(_cls, (%(argtxt)s))""" % { 'argtxt': argtxt } in ns, locals() ... and so on ... and remove lines from 'ns = ...' to 'Inner.__new__ = ...' The tests at the end of the file still pass so I'm not sure whether there is any situation that wouldn't work. For that matter I don't understand why tuple.__new__ needs to be pre-bound. Just referring to tuple.__new__ directly in the exec simplifies things even more as there is no need to specify any namespaces. exec """def __new__(_cls, %(argtxt)s): return tuple.__new__(_cls, (%(argtxt)s))""" % { 'argtxt': argtxt } also passes the tests. -- Duncan Booth