A __getattr__ for class methods?
I'm trying to implement a bunch of class methods in an ORM object in order to provide functionality similar to Rails' ActiveRecord. This means that if I have an SQL table mapped to the class "Person" with columns name, city, and email, I can have class methods such as: Person.find_by_name Person.find_by_city_and_name Person.find_by_name_and_city_and_email I have a metaclass generating basic properties such as .name and .city, but I don't want to generate a class method for every permutation of the attributes. I'd like to have something much like __getattr__ for instance attributes, so that if a method like Person.find_by_city_and_email cannot be found, I can construct a call to the basic find method that hides the SQL. Is there any way of doing this, or am I trying to mirror a functionality that Python simply does not have? -- http://mail.python.org/mailman/listinfo/python-list
Re: A __getattr__ for class methods?
Michael Spencer wrote: > Dylan Moreland wrote: > > I'm trying to implement a bunch of class methods in an ORM object in > > order to provide functionality similar to Rails' ActiveRecord. This > > means that if I have an SQL table mapped to the class "Person" with > > columns name, city, and email, I can have class methods such as: > > > > Person.find_by_name > > Person.find_by_city_and_name > > Person.find_by_name_and_city_and_email > > > > I have a metaclass generating basic properties such as .name and .city, > > but I don't want to generate a class method for every permutation of > > the attributes. I'd like to have something much like __getattr__ for > > instance attributes, so that if a method like > > Person.find_by_city_and_email cannot be found, I can construct a call > > to the basic find method that hides the SQL. Is there any way of doing > > this, ... > > Sure, define __getattr__ on the type of the class i.e., the metaclass, just as > you define it on a class to provide default-attribute-lookup to its instances: > > >>> class A(object): > ... class __metaclass__(type): > ... def __getattr__(cls, attr): > ... return "%s.%s" % (cls.__name__, attr) > ... > >>> A.somefunc > 'A.somefunc' > >>> A.someotherfunc > 'A.someotherfunc' > >>> > > HTH > > Michael Thanks! I only recently realized that I would have to learn metaclasses in order to make this work, and I'm still a bit unclear on their properties. -- http://mail.python.org/mailman/listinfo/python-list
Re: What editor shall I use?
Radek Kubicek wrote: > > What editor shall I use if my Python script must contain utf-8 > > characters? > > I use XP > > vim :-) > > > Thank you for reply > > l.b. > > not for all :-) I myself have just begun using vim. Does anyone have any tips/convenient tweaks for python programming with it? -- http://mail.python.org/mailman/listinfo/python-list
Re: how to remove using replace function?
I think you want to use the replace method of the string instance. Something like this will work: # See http://docs.python.org/lib/string-methods.html#l2h-196 txt = "an unfortunate in the middle" txt = txt.replace("", "") -- http://mail.python.org/mailman/listinfo/python-list
Re: how to remove using replace function?
[EMAIL PROTECTED] wrote: > nope didn't work Could you be more specific about the error? Both my example and yours work perfectly on my box. -- http://mail.python.org/mailman/listinfo/python-list
Re: Newbie Q: dynamically assigning object attribute
Take a look at the built-in function setattr: http://ftp.python.org/doc/lib/built-in-funcs.html#l2h-64 -- http://mail.python.org/mailman/listinfo/python-list
Re: Newbie Q: dynamically assigning object attribute
No problem. There are, in fact, ugly class-based methods of doing this. You could assign to an instance's __dict__ dictionary, or -- if the class is a new-style class -- you can call the __setattr__(self, name, value) method. -- http://mail.python.org/mailman/listinfo/python-list
Re: Splitting a string
Take a look at: http://docs.python.org/lib/node115.html#l2h-878 So I would try something like: pat = re.compile(r" (?:AND|OR|AND NOT) ") pat.split(string) Compile the regular expression with re.IGNORECASE if you like. Nico Grubert wrote: > Dear Python users, > > I'd like to split a string where 'and', 'or', 'and not' occurs. > > Example string: > s = 'Smith, R. OR White OR Blue, T. AND Black AND Red AND NOT Green' > > I need to split s in order to get this list: > ['Smith, R.', 'White', 'Blue, T.', 'Back', 'Red', 'Green'] > > Any idea, how I can split a string where 'and', 'or', 'and not' occurs? > > > Thank you very much in advance, > Nico -- http://mail.python.org/mailman/listinfo/python-list
Re: Splitting a string
Woops! Thanks for the correction. I was assuming greediness for some reason. Fredrik Lundh wrote: > Dylan Moreland wrote: > > > So I would try something like: > > > > pat = re.compile(r" (?:AND|OR|AND NOT) ") > > pat.split(string) > > footnote: this yields: > > ['Smith, R.', 'White', 'Blue, T.', 'Black', 'Red', 'NOT Green'] > > (the | operator picks the first (leftmost) alternative that results in an > overall match.) > > -- http://mail.python.org/mailman/listinfo/python-list
Re: how to write a C-style for loop?
John Salerno wrote: > I assume this is the way for loops are written in C, but if it helps to > be specific, I'm referring to C# for loops. The Python for loop seems to > be the same (or similar) to C#'s foreach loop: > > foreach int i in X > > But how would you write a C# for loop in Python? Do you rework a while > loop, or use the range() function? > > Here's an example: > > for (int i = 0; i < 50; i += 5) > > How would that go in Python, in the simplest and most efficient way? > > Thanks. Take a look at the range() builtin. That should give you what you need. -- http://mail.python.org/mailman/listinfo/python-list
Re: looping over more than one list
> def lowest(s1,s2): > s = "" > for c1,c2 in [x for x in zip(s1,s2)]: > s += lowerChar(c1,c2) > return s > > but it's hardly any more elegant than using a loop counter, and I'm > guessing it's performance is a lot worse - I assume that the zip > operation is extra work? > > Iain Always look in itertools for stuff like this: http://docs.python.org/lib/itertools-functions.html#l2h-1392 for c1, c2 in itertools.izip(s1, s2): ... I haven't profiled it, but it makes sense that this would be fast. -- http://mail.python.org/mailman/listinfo/python-list
Re: general coding issues - coding style...
calmar wrote: > On 2006-02-18, Diez B. Roggisch <[EMAIL PROTECTED]> wrote: > > - why are these {{{ thingies there? > > markers for folding for vim > http://www.calmar.ws/tmp/sc.png I would look into one of the many Vim scripts which automatically fold most large blocks without the ugly {{{. -- http://mail.python.org/mailman/listinfo/python-list
Re: Getting a list of all classes derived from a base class
Vijairaj R wrote: > Hi, > I have a requirement to findout all the classes that are derived from a > single base class. > > This is how I do it currently. > > class Test: > case = [] > > class Test1(Test): > Test.case.append("Test1") > > class Test2(Test): > Test.case.append("Test2") > > 1. Is there a better way of doing this. > 2. Is there a way to generalize the Test.case.append("TestN") > statements to something like > Test.case.append(__myclass__) > > -- > Warm Regards, > Vijairaj If you're willing to use metaclass madness: class TestMeta(type): def __init__(cls, name, bases, dct): if bases == (object,): return # Prevent the appending of Test cls.case.append(cls) class Test(object): __metaclass__ = TestMeta case = [] class Test1(Test): pass class Test2(Test): pass print Test.case -- http://mail.python.org/mailman/listinfo/python-list
Re: Getting a list of all classes derived from a base class
Alex Martelli wrote: > Vijairaj R <[EMAIL PROTECTED]> wrote: >... > > class Test: > > do not use old-style classes: they exist ONLY for backwards > compatibility. > > Make you class Test new-style: > > class Test(object): >... > > > and you can call Test.__subclasses__() to get a list of all extant > subclassed of Test at any time. > > > Alex Thanks Alex. That's a new one to me -- new-style classes have so many strange properties. -- http://mail.python.org/mailman/listinfo/python-list
Re: - Removing Need For Repeated Definition of __str__
Ilias Lazaridis wrote: > I have some python code which looks similar to this: > > class Car(BaseClass) : >manufacturer = factory.string() >model = factory.string() >modelYear = factory.integer() > >def __str__(self): >return '%s %s %s' % (self.modelYear, self.manufacturer, > self.model) > > def factory.string(self) > s = String() # creates a string object > #... # does several things > return s # returns the string object > > - > > I would like to simplify it in this way: > > class Car(BaseClass): >manufacturer = factory.string(2) # 2 = position number... >model = factory.string(3) # ...withinn __str__ >modelYear = factory.integer(1) > > def factory.string(self, position) > s = String() # creates a string object > ... # does several things > # creates somehow the __str__ functionality... > > return s # returns the string object > > - > > How could I achieve this? > > . > I'm slightly confused about your use of factory functions for making instance variables (perhaps you could explain that?). Without knowing more about that, here's a mixin solution I've used in the past (note that __strdef__ is something I just made up): class SmartStr(object): def __str__(self): return "<%s %s>" % (self.__class__.__name__, ", ".join(attrname + "=" + str(getattr(self, attrname)) for attrname in self.__strdef__)) class Car(SmartStr): __strdef__ = ["model_year", "manufacturer", "model"] def __init__(self, manufacturer, model, model_year): self.manufacturer = manufacturer self.model = model self.model_year = model_year c = Car("Toyota", "Camry", 1990) print c # => -- http://mail.python.org/mailman/listinfo/python-list