【问题标题】:strange behavior of constant 'e' in PythonPython中常量'e'的奇怪行为
【发布时间】:2020-04-20 08:39:33
【问题描述】:

我在 Python 中遇到了非常奇怪的行为。 我是一名电子工程师。所以我有时在方程中使用常数'e'。

from math import *

try:
    eval('print(log(e))')
except Exception as e:
    print(e)

try:
    eval('print(long(e))')
except Exception as e:
    print(e)

try:
    eval('log(e)')
except Exception as e:
    print(e)

输出是

1.0
name 'long' is not defined
name 'e' is not defined

我想念输入 log(e) 到 long(e)。在那个方程之前 log(e) 运行良好,但是 long(e) 之后的第二个 log(e),Python 不理解 'e'。

你知道那里发生了什么吗?

我在 Windows 上使用 python3.8.2。

【问题讨论】:

  • 您还将异常命名为e。此外,您应该很少使用通配符导入。
  • 将“Exception as e”更改为“Exception as err”(并将 e 更改为 err in print)然后再试一次?
  • 哇。你是对的。我将“Exception as e”更改为“Exception as err”,它工作正常。非常感谢。
  • 我正在制作简单的基于文本的计算器。所以 eval 很容易实现。我听说'eval'有点危险。但用户只有我。 :)
  • @Jens 在编辑问题中的代码时要非常小心 - 在这种情况下,如果没有抛出错误,则不会输入 except 块并且 e 不会'不要被遮蔽.

标签: python


【解决方案1】:

设置:

except Exception as e:

隐藏math 导入的名称,但在输入 except 块时(即抛出错误)。引用在except 块之外被清除,但这会删除对e任何 引用。相当于:

>>> from math import e
>>> e
2.718281828459045
>>> e = "foo"  # shadow the imported name
>>> e
'foo'
>>> del e  # try to return to previous value
>>> e
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'e' is not defined

the documentation 中的 try 声明也提到了这一点(强调我的):

当使用as target 分配异常时,它会被清除 在 except 子句的末尾。这好像

except E as N:
    foo

被翻译成

except E as N:
    try:
        foo
    finally:
        del N

最简单的修复方法是:

  • 将异常重命名为e以外的名称;或
  • import math 然后引用 math.e(注意通配符导入是 discouraged by PEP-0008)。

【讨论】:

    【解决方案2】:

    所以我们从math 模块中隐藏变量e。在第二个try-catch 中,您将异常捕获为e,因此,来自math 模块的e 将被此e(异常)替换。

    您应该始终牢记,切勿使用已被您正在导入的某些模块等使用的变量名。例如,不要使用变量名list,因为它会影响内置类型list 你的程序会表现得很奇怪。

    为了解决这个问题,替换这个:

    except Exception as e:
    

    到这里:

    except Exception as ex:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2011-03-01
      相关资源
      最近更新 更多