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