如何检查可通过Python计算的str类型

如何检查可通过Python计算的str类型,python,types,eval,Python,Types,Eval,有没有办法检查可以计算的字符串类型 例如: y = 2 x = 2 z = "y + x" eval(z) 因此可以计算变量z。这很好,但是当我在z上调用isinstance时,它将返回函数,而不是str 或者,如果可能的话,我可以检查是否可以计算某些内容吗?您确定要在此处输入字符串吗 y = 2 x = 2 z = lambda: y + x print z() if callable(z): print "z is a function" 否则,最简单的方法是尝试运行它: z

有没有办法检查可以计算的字符串类型

例如:

y = 2
x = 2
z = "y + x"
eval(z)
因此可以计算变量z。这很好,但是当我在z上调用isinstance时,它将返回函数,而不是str


或者,如果可能的话,我可以检查是否可以计算某些内容吗?

您确定要在此处输入字符串吗

y = 2
x = 2
z = lambda: y + x
print z()

if callable(z):
    print "z is a function"
否则,最简单的方法是尝试运行它:

z = "y + x"
try:
    eval(z)
    print "z was runnable (And we ran it)"
except Exception:
    print "Nope, z is not a string that we can run"
如果您不想实际运行它,可以对其进行预编译:

z = 'x + y'
try:
    z = compile(z + '\n', '<expression for z>', 'eval')
except SyntaxError:
    raise Exception("Could not process z")

# later
eval(z)
z='x+y'
尝试:
z=编译(z+'\n',''eval')
除SyntaxError外:
引发异常(“无法处理z”)
#后来
评估(z)
或者如果您真的想成为黑客(python 3):

z='x+y'
尝试:
z_code=compile(z+'\n',''eval')
z=λ:无
z、 _u code_u=z_ucode#用一些新代码替换空函数的内容
除SyntaxError外:
引发异常(“无法处理z”)
#稍后-它现在实际上是一个函数!
断言类型(z)=types.FunctionType
z()

我想到了一个解决方案,看看是否可以计算字符串:

def can_evaluate(string):
    try:
        eval(string)
        return True
    except SyntaxError:
        return False

但是,如果可以对字符串进行求值,则会产生执行求值的副作用。

但什么是
z
?这是一根绳子。。。如果你想要一个函数,那么就声明它是。是的,它必须是,因为我们正在做的赋值涉及到我们对一个可以计算的字符串调用检查。
def我们可以执行(text):引发异常(“首先不要尝试从文本运行代码”)
try
除了
eval
调用之外,根据您所说的“可以计算”的意思,演示了如何检查字符串是否为有效的python代码排序?这不是对
z
的有效检查,因为
x
y
可能不可见,在这种情况下,您会得到
NameError
@RyanHaining:取决于OPs对“可评估”的定义。尽管抛出异常,
1/0
是否可计算?@Eric这是真的。所以OP的意思可能是“可分析的”?@RyanHaining:这是正确的,正如Eric所说,如果通过“可评估”OP的意思是“完全正确”,这就是正确的解决方案。如果他/她表示在定义字符串的范围内有意义,则此解决方案不正确
def can_evaluate(string):
    try:
        eval(string)
        return True
    except SyntaxError:
        return False