我想检查变量是否存在.现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
Run Code Online (Sandbox Code Playgroud)
还有其他方法没有例外吗?
我为我的应用程序不期望的每个条件创建了异常. UserNameNotValidException,PasswordNotCorrectException等等.
但是我被告知我不应该为这些条件创建例外.在我的UML中,那些是主流的例外,为什么它不应该是例外?
创建例外的任何指导或最佳实践?
有没有办法检查是否定义了具有指定名称的变量(类成员或独立)?例:
if "myVar" in myObject.__dict__ : # not an easy way
print myObject.myVar
else
print "not defined"
Run Code Online (Sandbox Code Playgroud) 在一些地方(这里和这里)已经说过,Python强调"请求宽恕而不是许可"(EAFP)应该通过以下观点来缓和,即异常只应在真正特殊情况下调用.考虑以下内容,我们将弹出并推送优先级队列,直到只剩下一个元素:
import heapq
...
pq = a_list[:]
heapq.heapify(pq)
while True:
min1 = heapq.heappop(pq)
try:
min2 = heapq.heappop(pq)
except IndexError:
break
else
heapq.heappush(pq, min1 + min2)
# do something with min1
Run Code Online (Sandbox Code Playgroud)
异常仅在len(a_list)循环的迭代中引发一次,但它并不是特别的,因为我们知道它最终会发生.这个设置使我们a_list无需检查是否空了很多次,但(可能)它比使用显式条件更不易读.
对这种非特殊程序逻辑使用异常的共识是什么?
我有这段代码:
#!/usr/bin/env python
def get_match():
cache=[]
def match(v):
if cache:
return cache
cache=[v]
return cache
return match
m = get_match()
m(1)
Run Code Online (Sandbox Code Playgroud)
如果我运行它,它说:
UnboundLocalError: local variable 'cache' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
#!/usr/bin/env python
def get():
y = 1
def m(v):
return y + v
return m
a=get()
a(1)
Run Code Online (Sandbox Code Playgroud)
它运行.
列表中有什么东西吗?或者我的代码组织错了?
我在Ruby中遇到了一个有趣的表达:
a ||= "new"
Run Code Online (Sandbox Code Playgroud)
这意味着如果未定义a,则将"new"值分配给a; 否则,a将与它相同.在进行一些数据库查询时很有用.如果设置了该值,我不想触发另一个数据库查询.
所以我在Python中尝试了类似的思维方式:
a = a if a is not None else "new"
Run Code Online (Sandbox Code Playgroud)
它失败了.我认为这是因为你不能在Python中做"a = a",如果a没有定义.
所以我可以出来的解决方案是检查locals()和globals(),或者使用try ... except表达式:
myVar = myVar if 'myVar' in locals() and 'myVar' in globals() else "new"
Run Code Online (Sandbox Code Playgroud)
要么
try:
myVar
except NameError:
myVar = None
myVar = myVar if myVar else "new"
Run Code Online (Sandbox Code Playgroud)
我们可以看到,解决方案并不那么优雅.所以我想问一下,有没有更好的方法呢?
TL; DR:如果我使用的pytest还有其他一些仅测试的依赖项,是否可以断言这些仅测试的依赖项没有泄漏到实际的非测试代码中?
在Java中,当我运行测试时,测试本身和被测代码将在不同的类加载器中运行,并且它们的依赖关系在此作用域内。因此,如果无意中引用testng了被测代码,则即使testng正在运行测试,测试也将失败。
可以在Python中实现吗?如果我的非测试代码不小心导入了pytest,我可以抓住它并使测试失败吗?我看不到如何实现这一目标。
虽然setuptools和pip等,使其比较容易保持安装/运行和开发/测试的依赖分开,甚至避免污染当前VENV,他们仍然存在测试运行时。这意味着python setup.py test可以通过模块运行,但是python setup.py install导入该模块之后却很简单。
鉴于:
cat setup.py
from setuptools import setup, find_packages
setup(
name="brettpy",
version="0.0.1",
packages=find_packages(),
setup_requires=["pytest-runner",],
tests_require=["pytest",],
)
Run Code Online (Sandbox Code Playgroud)
cat setup.cfg
[aliases]
test=pytest
Run Code Online (Sandbox Code Playgroud)
cat brettpy/__init__.py
import pytest
Run Code Online (Sandbox Code Playgroud)
cat tests/test_brettpy.py
def test_import_brettpy():
import brettpy
del brettpy
def test_run_main():
from brettpy import __main__ as main
main.main()
Run Code Online (Sandbox Code Playgroud)
... python setup.py test将通过,但python setup.py install && python -m brettpy失败:
ModuleNotFoundError: No …Run Code Online (Sandbox Code Playgroud) 对于Python变量(例如List和integer),如果我们不初始化它,它们总是None吗?是否有任何情况Python即使我们没有明确初始化它也会为我们做初始化?
对于初始化,我的意思是,
Foo = []
Goo = 0
Run Code Online (Sandbox Code Playgroud)
林先生,提前谢谢
如何在一行中做出这个声明?
if x is not None:
if x > 0:
pass
Run Code Online (Sandbox Code Playgroud)
如果我只用“和”写,如果没有,它会显示异常
if x is not None and x > 0:
pass
Run Code Online (Sandbox Code Playgroud) python ×9
exception ×3
closures ×1
expression ×1
pytest ×1
python-2.7 ×1
python-2.x ×1
ruby ×1
scope ×1
variables ×1