Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!goblin2!goblin.stu.neva.ru!newsfeed.xs4all.nl!newsfeed3.news.xs4all.nl!xs4all!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.004 X-Spam-Evidence: '*H*': 0.99; '*S*': 0.00; 'dynamically': 0.07; 'explicit': 0.07; 'parser': 0.07; 'here?': 0.09; 'says.': 0.09; 'tmp': 0.09; 'subject:question': 0.10; 'cc:addr:python-list': 0.11; '(defined': 0.16; '__all__': 0.16; 'declarations': 0.16; 'library).': 0.16; 'object()': 0.16; 'pythonic': 0.16; 'subject:class': 0.16; '{})': 0.16; 'thanks,': 0.17; 'wrote:': 0.18; 'module': 0.19; 'email addr:gmail.com>': 0.22; 'cc:addr:python.org': 0.22; 'cc:2**0': 0.24; 'cc:no real name:2**0': 0.24; '>': 0.26; 'this:': 0.26; 'pass': 0.26; 'header:In-Reply-To:1': 0.27; 'external': 0.29; 'message- id:@mail.gmail.com': 0.30; 'code': 0.31; 'lines': 0.31; 'that.': 0.31; '(unless': 0.31; 'bunch': 0.31; 'extending': 0.31; 'way?': 0.31; 'class': 0.32; 'plain': 0.33; "i'd": 0.34; 'could': 0.34; 'classes': 0.35; 'created': 0.35; 'something': 0.35; 'but': 0.35; 'received:google.com': 0.35; 'there': 0.35; 'really': 0.36; 'doing': 0.36; 'list': 0.37; 'skip:& 10': 0.38; 'same.': 0.38; 'most': 0.60; 'name': 0.63; 'more': 0.64; 'different': 0.65; 'to:addr:gmail.com': 0.65; 'behavior': 0.77; 'completion': 0.78; 'zen': 0.84; '2013': 0.98 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 :cc:content-type; bh=Fhnqlq+33jNOEx61N4HJFa83toVIrpcfOAhdFy93OFA=; b=UUIVubLM5DOHC+tWJI2mHJhXMJGFQ0Whq/7wOL4y6dALcM9QhoZOZ+SvhMp1tAv0gB aDoVLut5h4a/HFtrezDGYetkWmgr30FI88rEnqb6Vk+ARBRPjapQaFhZNgFFnafnqsJb SUzULF/Lugt68AjkWSJYWoxuWfrocutDVIVVfyv9xiBiMdYV2cJnkagUD+dhGoBCFItI GDYuT6cRCbffYtcWAiElj1N2MYYxcXFDIiqYsCUl4XT4E2ijjLygDVoxAr332a/vEsZK SaG9Z39Ou306wKshJkAx0/vW9NVN1Fq0LMx5PAZtWCtAjwCzDPebTtV8gUMZQ/LUKPmg 5A0g== MIME-Version: 1.0 X-Received: by 10.229.141.10 with SMTP id k10mr1827088qcu.44.1372289724029; Wed, 26 Jun 2013 16:35:24 -0700 (PDT) In-Reply-To: <138ce5a8-1b4c-49d4-8005-d5f4642dcb97@googlegroups.com> References: <138ce5a8-1b4c-49d4-8005-d5f4642dcb97@googlegroups.com> Date: Thu, 27 Jun 2013 00:35:23 +0100 Subject: Re: class factory question From: =?ISO-8859-1?Q?F=E1bio_Santos?= To: Tim Content-Type: multipart/alternative; boundary=90e6ba3098a887a35304e017198c Cc: python-list@python.org 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: 80 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1372290126 news.xs4all.nl 15882 [2001:888:2000:d::a6]:48608 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:49287 --90e6ba3098a887a35304e017198c Content-Type: text/plain; charset=ISO-8859-1 On 26 Jun 2013 14:14, "Tim" wrote: > > I am extending a parser and need to create many classes that are all subclassed from the same object (defined in an external library). When my module is loaded I need all the classes to be created with a particular name but the behavior is all the same. Currently I have a bunch of lines like this: > > class Vspace(Base.Command): pass > class Boldpath(Base.Command): pass > > There are a bunch of lines like that. > Is there a better way? Something like > > newclasses = ['Vspace', 'Boldpath', ... ] > for name in newclasses: > tmp = type(name, (Base.Command,) {}) > tmp.__name__ = name > > Is there a more pythonic way? > thanks, > --Tim > I would say The Most Pythonic Way is to use the class declarations as you are doing now. Explicit is better than implicit, or so the zen says. It will be better for tools as well. I'd like to see code completion work on dynamically created classes like that (unless you use __all__ to list them.). And, are you really looking for classes here? If you just want to create different names with different identities, you could consider using plain old strings or object() to do that. --90e6ba3098a887a35304e017198c Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable


On 26 Jun 2013 14:14, "Tim" <jtim.arnold@gmail.com> wrote:
>
> I am extending a parser and need to create many classes that are all s= ubclassed from the same object (defined in an external library). =A0When my= module is loaded I need all the classes to be created with a particular na= me but the behavior is all the same. Currently I have a bunch of lines like= this:
>
> =A0 =A0 class Vspace(Base.Command): pass
> =A0 =A0 class Boldpath(Base.Command): pass
>
> There are a bunch of lines like that.
> Is there a better way? Something like
>
> =A0 =A0 newclasses =3D ['Vspace', 'Boldpath', ... ] > =A0 =A0 for name in newclasses:
> =A0 =A0 =A0 =A0 tmp =3D type(name, (Base.Command,) {})
> =A0 =A0 =A0 =A0 tmp.__name__ =3D name
>
> Is there a more pythonic way?
> thanks,
> --Tim
>

I would say The Most Pythonic Way is to use the class declar= ations as you are doing now. Explicit is better than implicit, or so the ze= n says.

It will be better for tools as well. I'd like to see cod= e completion work on dynamically created classes like that (unless you use = __all__ to list them.).

And, are you really looking for classes here? If you just wa= nt to create different names with different identities, you could consider = using plain old strings or object() to do that.

--90e6ba3098a887a35304e017198c--