在Python中使用函数的正确方法?

时间:2014-09-03 17:54:27

标签: python function

问题是 - 在哪里以及如何使用try/exceptif/else运营商?

例如 - 我有功能:

# copy php.cgi script
def cpcgi(src, dst):
        try:
                shutil.copy(src, dst)
                if os.path.isfile(dst + '/php.cgi'):
                        return True
        except:
                print 'Something going wrong!'

存储在单独文件中的函数。 接下来,从脚本中调用如下:

import createvhostFuncts as fun

print 'Copying php.cgi file...'
if fun.cpcgi(vdir + 'php-cgi/php.cgi', (vdir + 'php-cgi/' + username + '/' + domain)):
        print 'Done.\n'
else:
        exit('Error! Exit now.\n')

但是 - createvhostFuncts.py中有很多功能。因此,我在脚本中有大量的if/else调用,看起来很......奇怪?无用?

那么 - 调用函数的正确方法是什么?更好地使用try/except - 内部函数或脚本?

UPD

例如 - 在BASH中,我可以像下一个一样使用somethig:

#!/usr/bin/env bash

func(){
        echo "Ya!"
}

if func; then
        echo $?
        echo "Printed"
else
        echo $?
        echo "Can't echo!"
fi

使用下一个结果运行它:

$ ./m
Ya!
0
Printed

或者有错误:

#!/usr/bin/env bash

func(){
        eCCCcho "Ya!"
}

if func; then
        echo $?
        echo "Printed"
else
        echo $?
        echo "Can't echo!"
fi


$ ./m
./m: line 4: eCCCcho: command not found
127
Can't echo!

2 个答案:

答案 0 :(得分:2)

在Python中,他们通常不使用函数返回值来表示成功状态(就像他们在C或Go中那样),而是如果出现问题,函数应该引发异常。

def cpcgi(src, dst):
    shutil.copy(src, dst)
    if not os.path.isfile(dst + '/php.cgi')
        raise WhateverError("Failed to copy {0}".format(src))

您可以从调用端(在脚本中)拦截异常或让它通过,在您的情况下将导致脚本终止与堆栈跟踪。然后,您不需要使用try..except打包每一个电话。

(旁注)如果您也不希望显示堆栈跟踪,可以使用sys.excepthook,如下所示:

def report(type, value, traceback):
    print "Error during execution {0}".format(value)

sys.excepthook = report

答案 1 :(得分:1)

在大文件中看起来很奇怪,有很多try / catch块。一致认为这是可以接受的,函数应该抛出错误而不是返回值来表示成功或失败。

如果没有抛出任何错误,你就像正常一样继续

以下是我编写代码的方法。在这两种情况下,它都到达脚本的末尾:

def cpcgi(src, dst):
    shutil.copy(src, dst)
    if not os.path.isfile(dst + '/php.cgi'):
        raise FailedCopyError("Could not copy {} to {}".format(src,dst))

import createvhostFuncts as fun

print 'Copying php.cgi file...'
try:
    fun.cpcgi(vdir + 'php-cgi/php.cgi', (vdir + 'php-cgi/' + username + '/' + domain)):

    # We have not encountered any errors so continue within the same code block

    a = 10
    b = 20
    c = 30

    # We encountered no errors

except FailedCopyError as e:
    # We have encountered an errof so break out of the try block.
    # We do not re-enter the try block, continue below.
    print(e) # This will print more information about the error


# We can continue here

print('The Try/Catch took care of everything')
print('Continue as if nothing happened')
d = 40
e = 50

阅读official python documentation

绝对有效