在python中,是否不赞成在if语句中使用额外条件以避免错误,或者是否应该与if语句分开进行?
示例:
我想确保d,它将是空字符串或数字字符串不是空白且不小于1.如果d是空字符串,则无法将其转换为浮点数。在尝试转换为float之前,该语句被评估为false,因此我没有收到错误。这是不好的做法吗?
def main():
d = "2.25"
check_d(d)
d = "0"
check_d(d)
d = ""
check_d(d)
def check_d(d):
if d and float(d) >= 1:
return True
print('d must be defined with value 1 or greater')
return False
def check_d_old(d):
try:
if float(d) >= 1:
return True
except:
pass
print('d must be defined with value 1 or greater')
return False
答案 0 :(得分:0)
如果您在try中包含if d
部分,则不需要ValueError
部分。这样的东西可以使用,如果它不是数字你会得到ValueError
,或者如果它是一个数字但是在1以下它会引发def check_d(d):
try:
if float(d) >= 1:
return 0
else:
raise ValueError()
except ValueError:
print('d must be defined with value 1 or greater')
return 1
。
except
使用额外的条件很好,但如果你可以跳过一些不必要的条件,那么整体运行速度会更快。另外,请尝试不要只使用 C:\Users\c.ginther>pip install pyodbc
Collecting pyodbc
Using cached pyodbc-3.0.10.tar.gz
Installing collected packages: pyodbc
Running setup.py install for pyodbc ... error
Complete output from command "c:\program files\python35\python.exe" -u -c "import setuptools, tokenize;__file__='C:\\Users\\CB9EB~1.GIN\\AppData\\Local\\Temp\\pip-build-mdyxyolm\\pyodbc\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-ag94eyey-record\install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_ext
building 'pyodbc' extension
creating build
creating build\temp.win-amd64-3.5
creating build\temp.win-amd64-3.5\Release
creating build\temp.win-amd64-3.5\Release\Users
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local\Temp
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-build-mdyxyolm
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-build-mdyxyolm\pyodbc
creating build\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-build-mdyxyolm\pyodbc\src
cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DPYODBC_VERSION=3.0.10 -DPYODBC_UNICODE_WIDTH=2 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include "-Ic:\program files\python35\include" "-Ic:\program files\python35\include" /EHsc /TpC:\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-build-mdyxyolm\pyodbc\src\buffer.cpp /Fobuild\temp.win-amd64-3.5\Release\Users\CB9EB~1.GIN\AppData\Local\Temp\pip-build-mdyxyolm\pyodbc\src\buffer.obj /Wall /wd4668 /wd4820 /wd4711 /wd4100 /wd4127 /wd4191
error: command 'cl.exe' failed: No such file or directory
,找出您想要查找的错误类型。
答案 1 :(得分:0)
第一个很好,假设d
总是符合你的标准,但第二个例子更健壮。
例如,当d = "a"
条件if d and float(d) >= 1:
将ValueError
提升try: except
时,d
会抓住并正常工作。
因此,如果您的" d的标准是空字符串或数字字符串"是绝对的,然后第一个是好的,但是如果epsilon
可以有其他值,那么你可能想要使用第二个。