On 14Dec2015 16:48, Vincent Davis <vinc...@vincentdavis.net> wrote:
On Mon, Dec 14, 2015 at 4:14 PM, Cameron Simpson <c...@zip.com.au> wrote:
First, notice that the code inside the try/except _only_ fetches the
attribute. Your version calls the "write" attribute, and also accesses
handle.name. Either of those might also emit AttributeError, and should
probably not be silently caught.
I think the intent of the original code was to check if handle had the
attribute "name", I don't think the attribute "write" was the issue.
I have to say that this was not at all evident to me. I think that also argues
for putting the smallest possible bit of code inside the try/except.
So then possibly this based on your suggestion:
try:
write = handel.write
except AttributeError:
raise
Someone has already suggested dropping the try/except altogether for this.
try:
name = handel.name
write("# Report_file: %s\n" % name)
except AttributeError:
pass
Again, I would minimise the stuff in the try/except, so:
try:
name = handle.name
except AttributeError:
pass
else:
write("# Report_file: %s\n" % name)
But in this case, in my code, I do two things:
Firstly, things needing names always get one:
class Foo:
def __init__(self, blah, name=None):
if name is None:
name = "Foo-%s" % (id(self),)
self.name = name
Secondly, for your use case "print the name if it has one" I _would_ use
hasattr:
if hasattr(handle, name):
write("# Report_file: %s\n" % name)
The logic feels far clearer to my eye.
Cheers,
Cameron Simpson <c...@zip.com.au>
--
https://mail.python.org/mailman/listinfo/python-list