On 12/14/2015 11:38 PM, Vincent Davis wrote:
In the code below try is used to check if handle has the attribute name. It
seems an if statement could be used. Is there reason one way would be
better than another?

def write_header(self):
     handle = self.handle
     try:
         handle.write("# Report_file: %s\n" % handle.name)
     except AttributeError:
         pass
     handle.write("########################################\n")

The specific use case I noticed this was
https://github.com/biopython/biopython/blob/master/Bio/AlignIO/EmbossIO.py#L38

Vincent Davis


Nothing wrong with the try block. However other forms may be shorter/more readable. Since there is 2 attribute lookups in the try block, (write and name) it's not clear which one you want to catch (except for the line following the except clause but it could not be the case).

Here are 2 alternative forms

1/ handle.write(handle.name if hasattr(handle, 'name') else '')
2/ handle.write(getattr(handle, 'name', ''))

Here's the best solution imo:
3/ assume handle has always a name attribute and don't write code handling attribute existence. Instead handle the attribute values:

class Handle:
  def __init__(self):
    self.name= None # and the problem is gone

if handle.name : handle.write(handle.name)


By the way, in the use case you've linked, it is written
'handle = self.handle'
at every beginning of each method. Don't follow that rule.


Jm


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to