On 23Jun2019 13:26, Arup Rakshit <a...@zeit.io> wrote:
In the below code:
@classmethod
def find(self, id):
if isinstance(id, list):
rows = self.__table__().get_all(*id).run(self.__db__().conn)
result = []
for row in rows:
acategory = Category()
acategory.__dict__.update(row)
result.append(acategory)
return result
else:
adict = self.__table__().get(id).run(self.__db__().conn)
acategory = Category()
acategory.__dict__.update(adict)
return acategory
I have 2 questions:
1. Is there any better way to create attributes in an object without using
__dict__().update() or this is a correct approach?
setattr() is the usual approach, but that sets a single attribute at a
time. If you have many then __dict__.update may be reasonable.
You should bear in mind that not all objects have a __dict__. It is
uncommon, but if a class is defined with a __slots__ attribute then its
instances have fixed attribute names and there is no __dict__. Also some
builtin types have not __dict__. However, you likely know that the
objects you are using have a __dict__, so you're probably good.
Also, __dict__ bypasses properties and descriptors. That might be
important.
2. Can we get the same result what for row in rows: block is producing without
killing the readability ?
Not obviously. It looks pretty direct to me.
Unless the Category class can be made to accept an attribute map in its
__int__ method, then you might do some variable on:
result = [ Category(row) for row in rows ]
which is pretty readable.
BTW, @classmethods receive the class as the first argument, not an
instance. So you'd normally write:
@classmethod
def find(cls, id):
...
and you would not have a self to use. is __table__ a class atribute or
an instance attribute?
To see the context, here is my source code
https://gitlab.com/aruprakshit/flask_awesome_recipes/blob/master/app/models/category.py
Ah, so Category inherits from BaseModel. That means you can write your
own __init__. If it accepted an optional mapping (i.e. a dict or row)
you could put the .update inside __init__, supporting the list
comprehension I suggest above.
It looks like you've marks almost all the methods as @classmethods. Are
you sure about that? They all seem written to use self, and thus be
instance methods.
Cheers,
Cameron Simpson <c...@cskk.id.au>
--
https://mail.python.org/mailman/listinfo/python-list