Если под defined
вы подразумеваете ever assigned any value whatsoever to in any scope accessible from here
, то попытка получить доступ к «неопределенной» переменной вызовет исключение NameError (или некоторый его подкласс, но перехват NameError также отловит подкласс). Итак, самый простой способ выполнить, буквально, совершенно странную задачу, о которой вы спрашиваете, это:
for varname in ('a', 'b', 'c'):
try: return eval(varname)
except NameError: pass
return default
Любое предполагаемое решение, в котором отсутствует попытка / исключение, не будет работать в вышеприведенном значении для "определенного". Подходы, основанные на исследовании конкретных областей, будут либо пропускать другие области, либо будут довольно сложными, если попытаться воспроизвести логику упорядочивания областей, которую eval
делает для вас так просто.
Если под «определенным» вы на самом деле имеете в виду «присвоенное значение, которое оценивается как истинное (в отличие от ложного)», т. Е. Все значения на самом деле определены (но может оказаться ложным, и вы вместо первого значения истинного значения), тогда уже предложенный a or b or c or default
становится самым простым подходом. Но это совершенно другое (и даже более странное!) Значение слова «определено»! -)