关于if条件的Python约定

时间:2016-06-27 17:17:05

标签: python

在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

2 个答案:

答案 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可以有其他值,那么你可能想要使用第二个。