git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Python refactoring question and create dynamic attributes


On 23/06/19 7:56 PM, Arup Rakshit 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?
> 2. Can we get the same result what for row in rows: block is producing without killing the readability ?


Examining the readability concern(s):-

1
If it seems complex, first write a comment (in plain English).

2
Is the most basic refactoring improvement is any possible improvement in 
attribute/variable names?


A mid-point between these two: if you find the intricate coding of 
specific concepts awkward to read/explain, eg

__table__().get_all(*id).run(self.__db__().conn)
or __dict__.update(row)

then might you consider a short 'helper function' - whose name will 
explain-all and whose body will 'hide' or abstract the complex detail?

eg absorb_attributes( acategory, row )

(and yes, someone, somewhere, is absolutely itching to throw-in a Star 
Trek reference!)
-- 
Regards =dn