在Python中解析/创建类型

时间:2014-03-31 21:04:16

标签: python types type-conversion tokenize

我正在试图弄清楚如何创建类型并根据这些类型转换用户输入。 例如:

用户输入:5

5是Number类型 5被添加到列表

用户输入:3.5

3.5是Number类型 3.5被添加到列表中

用户输入:: true:

:true:属于Boolean类型 :true:被添加到列表中

我希望我的程序能够将数字5转换为int然后将其转换为堆栈,3,5转换为浮点数然后将其放在堆栈上并知道:true:具有值True。

这是我到目前为止所尝试的但是没有按照预期的方式工作:

    #!/util/bin/python
import re
import shlex
stack = []

tokens = (
  ('STRING', re.compile('"[^"]+"')),  # longest match
  ('NAME', re.compile('[a-zA-Z_]+')),
  ('SPACE', re.compile('\s+')),
  ('NUMBERD', re.compile('\d.')),
  ('NUMBERI', re.compile('\d+')),
  ('TRUE', re.compile(':true:')),
  ('FALSE', re.compile(':false:')),
  )

def main ():


    while 1:
        inp = input('INPUT> ')
        push(inp,stack) #Push User Input unto stack
        printStack(stack) #Print Stack
        quit(inp,stack) #Exit program if prompted  




def push(s,list):
    tokens = shlex.split(s, posix=False)
    for token in tokens:
        if type(s) == 'NUMBERI':
            list.append(int(token))
        elif type(s) == 'NUMBERD':
            list.append(float(token))
        else:
            list.append(token)

    return list

def printStack(stack):
    for index in stack[::-1]:
        print (index)



def quit (x, stack):
    if x == "quit":
        stack.pop()
        exit(0)


def type(s):
    i = 0
    lexeme = []
    while i < len(s):
        match = False
        for token, regex in tokens:
            result = regex.match(s, i)
            if result:
                return(token)
                i = result.end()
                match = True
                break
        if not match:
            raise Exception('lexical error at {0}'.format(i))




def add (x,y):
    return(x + y)

def sub (x,y):
    return(x - y)

def mul (x,y):
    return(x * y)

def div (x,y):
    return(x / y)   


main()

2 个答案:

答案 0 :(得分:0)

使用ast.literal_eval,它可以安全地将字符串计算为表达式。

演示:

>>> from ast import literal_eval
>>> a = literal_eval('5')
>>> b = literal_eval('3.5')
>>> c = literal_eval('True')
>>> [e, type(e).__name__ for e in (a, b, c)]
[(5, 'int'), (3.5, 'float'), (True, 'bool')]

答案 1 :(得分:0)

尝试:

push(str(inp),stack) #Push User Input unto stack