Handling 3 operands in an expression without raising an exception

Νίκος nikos.gr33k at gmail.com
Thu Sep 26 04:46:18 EDT 2013


Στις 26/9/2013 11:39 πμ, ο/η Νίκος έγραψε:
> Στις 26/9/2013 11:12 πμ, ο/η Jussi Piitulainen έγραψε:
>> Νίκος writes:
>>
>>> Σ�ις 26/9/2013 10:48 πμ, ο/η Jussi Piitulainen
>>> έγ�α�ε: > ί�ος writes:
>>>>
>>>>> How can i wrote the two following lines so for NOT to throw out
>>>>> KeyErrors when a key is missing?
>>>>>
>>>>> city = gi.time_zone_by_addr( os.environ['HTTP_CF_CONNECTING_IP'] ) or
>>>> ...
>>>>> I was under the impression that the 'or' operator was handling this
>>>>> in case one operand was failing but its not the case here.
>>>>
>>>> "f(x) or g(x)" raises an exception if "f(x)" raises an exception, or
>>>> if "f(x)" returns a false value and "g(x)" raises an exception.
>>>>
>>>>> Then i thought of os.environ.get() to default to something but then
>>>>> again we have 3 operand in the expression.
>>>>
>>>> Adapt this:
>>>>
>>>>     >>> {}.get('foo') or {'empty':''}.get('empty') or 'catchall'
>>>>     'catchall'
>>>>
>>>> Or nest the calls this way if an empty string is a valid value:
>>>>
>>>>     >>> {}.get('foo', {'empty':''}.get('empty', 'catchall'))
>>>>     ''
>>>>
>>>> This will compute the default values even when they are not used.
>>>
>>> I'am sorry but i do not understand the last statements at all so i
>>> can have chnace to adapt them.
>>
>> Do you know what {} is?
>>
>> Do you know what {}.get('foo') is?
>>
>> Do you know what x.get('foo') is if x is {}?
>>
>> Do you know what {'empty':''}.get('empty') is?
>>
>> Do you know what {'empty':''}.get('fruit') is?
>>
>> Do you know what (None or '' or 'catchall') is?
>>
>> Do you know what {}.get('foo', 'bar') is?
>>
>> Do you know what {}.get('foo', {}.get('bar', 'huh')) is?
>>
>> Do you know what ('foo'[3] or 'else') does?
>>
>> Do you know what ('foo' or 'else'[5]) does?
>>
>> Do you know how to launch an interactive Python session where you can
>> play with such expressions until you get the hang of it? There is no
>> substitute for that experience.
>>
>> Do you know that you can ask for help({}.get) or help(dict.get) or
>> even help(os.environ.get) during such an interactive Python session,
>> and Python (unlike Macbeth's spirits from the vasty deep) will answer?
>>
> You dont have to be ironic. I dont have the experience you do.
>
> Up until now i have this:
>
> city = gi.time_zone_by_addr( os.environ['HTTP_CF_CONNECTING_IP'] ) or
> gi.time_zone_by_addr( os.environ['REMOTE_ADDR'] ) or "Άγνωστη Πόλη"
>
>
> can this be written as:
>
> city = gi.time_zone_by_addr( os.environ.get('HTTP_CF_CONNECTING_IP',
> os.environ['REMOTE_ADDR'] )) or "Άγνωστη Πόλη"
>
> It makes it more easily for me to understand this way.

Let me try be more specific:

i want to switch this:

city = gi.time_zone_by_addr( os.environ['HTTP_CF_CONNECTING_IP'] ) or 
gi.time_zone_by_addr( os.environ['REMOTE_ADDR'] ) or "Άγνωστη Πόλη"

host = socket.gethostbyaddr( os.environ['HTTP_CF_CONNECTING_IP'] )[0] or 
socket.gethostbyaddr( os.environ['REMOTE_ADDR'] )[0] or "Άγνωστη Προέλευση"

because it raises KeyError exceptions to this:

city = gi.time_zone_by_addr( os.environ.get('HTTP_CF_CONNECTING_IP', 
'REMOTE_ADDR') )    or "Άγνωστη Πόλη"

host = socket.gethostbyaddr( os.environ.get('HTTP_CF_CONNECTING_IP', 
'REMOTE_ADDR') )[0] or "Άγνωστη Προέλευση"

But that doesnt seem to also work.
I want to use the get method because i know if it doesnt does detect a 
dictionary key item than default back what we give it.



More information about the Python-list mailing list