相关疑难解决方法(0)

如何删除导出的环境变量?

在安装gnuplot之前,我设置了环境变量GNUPLOT_DRIVER_DIR = /home/gnuplot/build/src.在安装过程中出现了问题.

我想删除GNUPLOT_DRIVER_DIR环境变量.我怎样才能实现它?

linux environment-variables unset

1439
推荐指数
6
解决办法
82万
查看次数

类状态无效时会引发什么错误?

在Python类中,当在运行该方法之前必须更改类的某些其他属性时,我应该从实例方法中引出什么类型的错误?

我来自我将使用的C#背景InvalidOperationException,"当方法调用对于对象的当前状态无效时引发的异常",但我在Python中找不到等效的内置异常.

ValueError当问题出在函数参数时,我一直在提高("当内置操作或函数接收到具有正确类型但不适当值的参数时引发").我认为这在技术上是self参数的无效值; 这是治疗它的正确方法吗?例如,这是惯用的:raise ValueError("self.foo must be set before running self.bar()")

python exception

25
推荐指数
2
解决办法
1万
查看次数

Python设计模式适用于许多条件

在许多条件下编写验证函数的推荐结构是什么?见这两个例子.第一个看起来很丑,第二个不常见,也许是因为assert通常用来排除意外行为.还有更好的选择吗?

def validate(val):
  if cond1(val):
    return False
  if cond2(val):
    return False
  if cond3(val)
    return False
  return True
Run Code Online (Sandbox Code Playgroud)

要么

def validate(val):
  try:
    assert cond1(val)
    assert cond2(val)
    assert cond3(val)
    return True
  except AssertionError:
    return False
Run Code Online (Sandbox Code Playgroud)

python design-patterns

14
推荐指数
2
解决办法
1689
查看次数

禁用python的assert()而不使用-0标志

我正在从不同的软件中运行一个python脚本(它提供了一个python接口来操纵它的数据结构).

我正在优化我的代码速度,并希望看到我的断言对性能有什么影响.

我无法使用python -O.我有什么其他选项,以编程方式禁用python代码中的所有断言?变量__debug__(由-O标志清除)不能分配给:(

python debugging assert

10
推荐指数
1
解决办法
3014
查看次数

从已编译的CPython中删除doc字符串但不断言

我想从一个Python程序删除文档字符串,但留下断言(和__debug__切片).我一直在使用-OO标志产生.pyo文件,但根据该文件,消除双方断言和文档字符串.

我正在使用CPython 2.7.

澄清:我正在删除文档字符串作为一种廉价的混淆方法.管理层做出了这个决定,我认为这是否有用是超出了这个问题的范围.

python cpython python-2.x python-2.7

5
推荐指数
1
解决办法
375
查看次数

如何操作内置函数的类型提示

我用来ElementTree解析/构建一些稍微复杂但定义良好的 xml 文件,并用于mypy静态类型。我的.find陈述遍布各处,这导致了这样的事情:

from xml.etree.ElementTree import Element
...
root.find('tag_a').append(Element('tag_b'))

# run mypy..
-> type None from Optional[Element] has no attribute append
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为find根本找不到我给它的标签。但我知道它就在那里,并且不想添加类似try..exceptorassert语句之类的东西,本质上只是简单地保持沉默mypy,而不添加功能,同时使代码可读性较差。我也想避免# type: ignore到处发表评论。


我尝试了猴子修补Element.find.__annotations__,在我看来这将是一个很好的解决方案。但由于它是内置的,我不能这样做,而且子类化Element又感觉太多了。

有没有好的办法解决这个问题呢?

python elementtree mypy

5
推荐指数
1
解决办法
1916
查看次数

尽管有 -O(优化)标志,仍保持断言

我对程序状态进行了多次检查,其失败将表明代码中存在错误。在这种情况下,我很乐意使用,assert condition因为它比if not condition: raise MyException.

使用assert代替raise有两个问题。

  1. assert不允许指定要引发的异常,因此稍后捕获它会变得困难(捕获AssertionError可能捕获太多)。

  2. assert当 -O 标志传递给解释器时禁用。

在我的环境中,代码中的任何错误都要求我放弃所有结果,直到识别并修复该错误。因此,捕获上述检查引发的异常是没有意义的。因此,问题#1 与我的情况无关。

问题#2 很严重。我希望我的检查保留在生产代码中,因为正确性比我的环境中的性能重要得多。如今很少有人使用 -O 标志;但有一天我或其他人可能更喜欢使用它(例如,抑制后面的代码if __debug__,或者因为 -O 可能在将来实际上优化代码)。由于我的所有assert语句都必须在生产代码中保持活动状态,因此我需要将所有assert语句替换为其他语句。assert尽管有 -O 标志,有什么方法可以强制留下来吗?

顺便说一句,我计划assert通过打印导致断言失败的行中的变量值来自定义行为。我想我可以通过替换sys.excepthook为我自己的函数来实现它,该函数捕获AssertionError,读取回溯,找到相关的源代码,打印相关行中的变量,然后重新引发异常。如果有人发现有问题,请告诉我。

python interpreter assert python-3.x

2
推荐指数
1
解决办法
778
查看次数