我正在试图弄清楚如何创建类型并根据这些类型转换用户输入。 例如:
用户输入: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()
答案 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