2013-07-12 10 views
5

Czy istnieje jakiś sposób, aby zrozumieć, jaki typ danych, który przechowuje ciąg ... Pytanie jest mało logiki ale patrz niżej przypadkachGet typ danych przechowywanych w ciągu znaków w Pythonie

varname = '444' 
somefunc(varname) => int 

varname = 'somestring' 
somefunc(varname) => String 

varname = '1.2323' 
somefunc(varname) => float 

moim przypadku: Dostaję mieszane dane na liście, ale są one w formacie ciągów.

myList = ['1', '2', '1.2', 'string'] 

Szukam ogólny sposób, aby zrozumieć, co ich dane, aby można było dodać odpowiednie porównanie. Ponieważ są one już konwertowane na format string, nie mogę naprawdę nazwać listy (myList) jako mieszanych danych ... ale czy jest jeszcze jakiś sposób?

+0

Próbowałem typ (eval ("123")) => int, ale typ (eval ('somename')) może zawieść, ponieważ nie można go ocenić ... również działałby nieprawidłowo, jeśli istnieje zmienna o nazwie somename – Prasath

+1

Jeśli masz tylko kilka typów do testowania, takich jak podstawowe typy danych i łańcuch znaków, a następnie tak (po prostu spróbuj je rzucić). W przeciwnym razie nie. –

+1

Powinieneś naprawdę edytować swoje OP zamiast komentować je – inspectorG4dget

Odpowiedz

14
from ast import literal_eval 

def str_to_type(s): 
    try: 
     k=literal_eval(s) 
     return type(k) 
    except: 
     return type(s) 


l = ['444', '1.2', 'foo', '[1,2]', '[1'] 
for v in l: 
    print str_to_type(v) 

Wyjście

+0

Będzie działać dla większości typów "prymitywnych". Nie będzie działać na nic bardziej złożonego, na przykład próbując uzyskać typ zmiennej, która jest obiektem funkcji (jak lambda). – 2rs2ts

+0

ten kod myśli, że jest ciągiem znaków – perreal

+0

Dzięki perreal !!! To działałoby dla moich aktualnych danych. – Prasath

7

Można użyć ast.literal_eval() i typ():

import ast 
stringy_value = '333' 
try: 
    the_type = type(ast.literal_eval(stringy_value)) 
except: 
    the_type = type('string') 
+2

Nie będzie działać na ciągach. – 2rs2ts

+1

To prawda, zobacz moją edycję. – murftown

+1

Dobrze już iść :) – 2rs2ts

1

chciałbym po prostu spróbować różnych rodzajów, w odpowiedniej kolejności:

>>> def detect(s): 
...  try: 
...   return type(int(s)) 
...  except (TypeError, ValueError): 
...   pass 
...  try: 
...   return type(float(s)) 
...  except (TypeError, ValueError): 
...   pass 
...  return type(s) 
... 
>>> detect('3') 
<type 'int'> 
>>> detect('3.4') 
<type 'float'> 
>>> detect('foo') 
<type 'str'> 
+2

Zastrzeżenie: Musisz zrobić 'int' przed' float' w przeciwnym razie możesz zrobić 'float (1)' i wszystko będzie dobrze. – 2rs2ts

Powiązane problemy