[Tutor] Looking for some comments on my code segment...
Dave (NK7Z)
dave at nk7z.net
Fri Feb 24 19:25:29 EST 2023
Cameron,
Many thanks to you for this suggestions, and more importantly why you
suggested what you did!
I will make the suggested changes!
73, and thanks,
Dave (NK7Z)
https://www.nk7z.net
ARRL Volunteer Examiner
ARRL Technical Specialist, RFI
ARRL Asst. Director, NW Division, Technical Resources
On 2/24/23 14:18, Cameron Simpson wrote:
> On 23Feb2023 19:14, Dave (NK7Z) <dave at nk7z.net> wrote:
>> def createtelnet():
>> global tn, failcode
>
> Try not to use globals, it makes things harder to resue. You could just
> return these from the function, and have the caller store them in
> whatever fashion it prefers.
>
>> try:
>> tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
>> logdata = "Telnet object created"
>> logit(logdata)
>>
>> except socket.timeout: # Times out, exit with error.
>> failcode = 1 # Let error handler know what is happening.
>> logdata = 'Unable to create telnet object, timed out'
>> logit(logdata)
>> exitscript() # Leave script.
>>
>> except EOFError:
>> logdata = 'Timeout reached in login.'
>> logit(logdata)
>> failcode = 10
>> exitscript() # Leave script.
>
> As a general principle you should keep try/except clauses as small as
> possible. I'd shuffle the bove to be:
>
> try:
> tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
> except socket.timeout: # Times out, exit with error.
> failcode = 1 # Let error handler know what is happening.
> logdata = 'Unable to create telnet object, timed out'
> logit(logdata)
> exitscript() # Leave script.
>
> except EOFError:
> logdata = 'Timeout reached in login.'
> logit(logdata)
> failcode = 10
> exitscript() # Leave script.
>
> else:
> logdata = "Telnet object created"
> logit(logdata)
>
> The more you have in the try/except, the less certainty you have that
> any exception you catch cme from what you intended to handle i.e. the
> telnetlib.Telnet() call. Supposing there was an exception during the
> logit("Telnet object created") call? You'd treat t as though there had
> been a telnet failure, not a logging failure.
>
>> Later on I am accessing the connection via:
>>
>> try:
>> result = tn.read_until(b"\r\n", TIMEOUT) # Get a line.
>> if result == 'b\'\'':
>> logdata = 'Stream has failed...'
>> logit(logdata)
>> failcode = 7
>> exitscript() # Leave script.
>
> Again, your try/excepts are too broad. Enclose _only_ the code whose
> errors you are handling.
>
> Two other things: by using global variables and calling exitscript()
> from your set up function you're embedding policy in the function i.e.
> that this function will only ever be called once and therefore globals
> can store the result, and that failure of this function should exit the
> entire programme.
>
> Usually a function might be called from many different situations, and
> maybe the caller has their own opinion about how failure should be
> handled, or might open 2 telnet connections, etc. By embedding policy
> about globals and aborting the programme in the function you remove the
> caller's flexibility.
>
> I'd change the function to be something like this:
>
> # get rid of the "global" statement, so "tn" is a local
> tn = None # placeholder values
> failcode = None
> try:
> tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
> except socket.timeout: # Times out, exit with error.
> failcode = 1 # Let error handler know what is happening.
> logdata = 'Unable to create telnet object, timed out'
> logit(logdata)
>
> except EOFError:
> logdata = 'Timeout reached in login.'
> logit(logdata)
> failcode = 10
>
> else:
> logdata = "Telnet object created"
> logit(logdata)
>
> return tn, failcode
>
> Then the caller can go:
>
> tn, failcode = createtelnet()
> if tn is None:
> logit('createtelnet failed, failcode = {failcode}')
> else:
> ... use tn to do stuff ...
>
> Cheers,
> Cameron Simpson <cs at cskk.id.au>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
More information about the Tutor
mailing list