Handling 3 operands in an expression without raising an exception

Dave Angel davea at davea.name
Fri Sep 27 06:43:52 EDT 2013


On 27/9/2013 05:19, Νίκος wrote:

> Στις 27/9/2013 1:55 πμ, ο/η Dave Angel έγραψε:

>>
>> Simply assign the default values BEFORE the try block, and use pass as
>> the except block.
>>
>> That still doesn't get around the inadvisability of putting those 3
>> lines in the try block.
>>
>> You still haven't dealt with the gt assignment and its possible
>> exception.
>>
> Yes gi must be removed form within the try block because iam tesign it 
> for failure.

Then why don't you do it below?

>
> I'am not sure what you mean though when you say:
>
>> Simply assign the default values BEFORE the try block, and use pass as
>> the except block.
>
> Can you please make it more clear for me?
>
> This is my code as i have it at the moment:
>
> ipval = ( os.environ.get('HTTP_CF_CONNECTING_IP') or 
> os.environ.get('REMOTE_ADDR', "Cannot Resolve") )
> try:
> 	gi = pygeoip.GeoIP('/usr/local/share/GeoIPCity.dat')
> 	city = gi.time_zone_by_addr( ipval )
> 	host = socket.gethostbyaddr( ipval ) [0]
> except socket.gaierror as e:
> 	city = "Άγνωστη Πόλη"
> 	host = "Άγνωστη Προέλευση"

ipval = ( os.environ.get('HTTP_CF_CONNECTING_IP') or 
os.environ.get('REMOTE_ADDR', "Cannot Resolve") )
city = "Άγνωστη Πόλη"
host = "Άγνωστη Προέλευση"
try:
	city = gi.time_zone_by_addr( ipval )
	host = socket.gethostbyaddr( ipval ) [0]
except socket.gaierror as e:
	pass

>
> Or even better since i actually use 3 vars inside the try block it would 
> be really neat to be able to detect which far failed and assign a 
> specific value variable failed depended.

ipval = ( os.environ.get('HTTP_CF_CONNECTING_IP') or 
os.environ.get('REMOTE_ADDR', "Cannot Resolve") )
city = None
host = None
try:
	city = gi.time_zone_by_addr( ipval )
	host = socket.gethostbyaddr( ipval ) [0]
except socket.gaierror as e:
	if not city:
		city = "Άγνωστη Πόλη"
	if not host:
		host = "Άγνωστη Προέλευση"

or:

ipval = ( os.environ.get('HTTP_CF_CONNECTING_IP') or 
os.environ.get('REMOTE_ADDR', "Cannot Resolve") )
city = None
host = None
try:
	city = gi.time_zone_by_addr( ipval )
	host = socket.gethostbyaddr( ipval ) [0]
except socket.gaierror as e:
	if not host:
		host = "Άγνωστη Προέλευση"
		if not city:
			city = "Άγνωστη Πόλη"

Note that in that last case, I tested the variables in the reverse
order.  Note also on both of these that I assumed that None is not a
reasonable value for either of those.  In fact, I also assume that an
empty string is not a reasonable value.  If I didn't like the latter
assumption, I'd have used tests like  if host is None:

>
> IF it can also be written in one-line afteer the excpect would be even 
> better. Call me persistent but when i can write somethign in 1-line i 
> wou;d prefer it over 3-lines.

Ridiculous.  But if you like code golf, you can always do:

city, host = "Άγνωστη Πόλη", "Άγνωστη Προέλευση"

You should study APL.  Many functions were written in one line, with
twenty lines of explanation.  The function itself was considered
unreadable nonsense. And if a function stopped working, general wisdom
was to throw it out, and re-implement the explanation. I studied it
briefly in class in 1970, and have no idea if there are current
implementations.


-- 
DaveA





More information about the Python-list mailing list