лучший способ узнать тип - PullRequest
1 голос
/ 23 апреля 2010

У меня есть дикт

val_dict - {'val1': 'abcd', 'val': '1234', 'val3': '1234.00', 'val4': '1abcd 2gfff'}

Все значения для моих ключей являются строковыми.

Так что мой вопрос в том, как найти тип для моих значений в dict.

Я имею в виду, если я скажу, что `int (val_dict ['val1']) выдаст мне ошибку.

По сути, я пытаюсь выяснить, является ли строка фактической строкой или int или float.

if int( val_dict['val1'):
dosomething
else if float(val_dict['val1']):
dosomething

спасибо

Ответы [ 4 ]

3 голосов
/ 23 апреля 2010

Может быть, это:

is_int = True
try:
    as_int = int (val_dict['val1'])
except ValueError:
    is_int = False
    as_float = float (val_dict['val1'])

if is_int:
    ...
else:
    ...

Вы можете избавиться от is_int, но тогда в try...except будет много кода (вся обработка значений с плавающей запятой), и я чувствую себя неловко по этому поводу.

2 голосов
/ 24 апреля 2010

Все значения , конечно, «фактические строки» (вы можете делать с ними все, что вы можете делать со строками!), Но я думаю, что большинство респондентов знают, что вы имеете в виду - вы хотите попробовать Преобразование каждого значения в несколько возможных типов по очереди («int», а затем «float» - это именно то, что вы называете, но не может быть других ...?) и возвращаете и используете первое успешное преобразование.

Это, конечно, лучше всего инкапсулировать в функции, вне логики вашего приложения. Если наилучшим соответствием для ваших нужд является просто выполнить преобразование и вернуть «наилучшее преобразованное значение» (и все они будут использованы аналогично), то:

def best_convert(s, types=(int, float)):
  for t in types:
    try: return t(s)
    except ValueError: continue
  return s

если вы хотите сделать что-то свое в каждом случае, то:

def dispatch(s, defaultfun, typesandfuns):
  for t, f in typesandfuns:
    try: 
      v = t(s)
    except ValueError:
      continue
    else:
      return f(v)
  return defaultfun(s)

должен называться, например, как

r = dispatch(s, asstring, ((int, asint), (float, asfloat)))

если функции, которые должны вызываться для "неконвертируемых строк", конвертируемых в int и конвертируемых в float, но не int соответственно, равны asstring, asint, asfloat.

Я не рекомендую поместить «структурный», попытаться по очереди конвертировать в эти различные типы и действовать соответственно «коду» в неразрывной смеси с вашей «логикой приложения» - это очевидный случай для аккуратно наслоение двух аспектов, с хорошей структурой и разделением.

0 голосов
/ 24 апреля 2010

вы можете определить, будет ли строка очень легко преобразовываться в целые или с плавающей точкой, без использования исключений

# string has nothing but digits, so it's an int
if string.isdigit():
    int(string)

# string has nothing but digits and one decimal point, so it's a float
elif string.replace('.', '', 1).isdigit():
    float(string)
0 голосов
/ 24 апреля 2010

Простое решение, если у вас не слишком много форматов, может включать проверку формата каждого значения.

def intlike(value):
    return value.isdigit()
def floatlike(value):
    import re
    return re.match("^\d+\.\d+$")

if intlike(val_dict['val1']):
    dosomething(int(val_dict['val1']))
elif floatlike(val_dict['val1']):
    somethingelse(float(val_dict['val1']))
else:
    entirelydifferent()

Тем не менее, действительно проще использовать структуру исключений Python для некоторых сложных форматов:

def floatlike(value):
    try:
        float(value)
    except ValueError:
        result = False
    else:
        result = True
    return result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...