3

在我对计算机科学课程的介绍中,我们正在学习命名空间。我理解这个概念,当导入一个像数学这样的模块时,我们正在导入一个命名空间和该命名空间下的类属性,但是执行这个过程让我很困惑。这是我不知道如何开始执行的问题之一:

编写一个函数,name_add(a,b)使用异常处理(只是一个简单的try/except语句)来添加两个对象,a 和 b,并返回结果。+ operator如果用户使用未定义的任何类型调用该函数,则该函数应打印一条消息,说明加法运算符在type(a)和之间未定义type(b)(无论这些类型是什么)......l

如果有人可以逐步解释这个函数应该是什么样子或者他们用初学者的术语来问什么,我将不胜感激,因为我根本不了解这一点或它与命名空间的关系。

4

3 回答 3

3

您需要捕获 TypeError 异常。这就是问题的答案:

def name_add(a,b):
    try:
        return a+b
    except TypeError:
        print 'The + operator is not defined for a and b'
        return None

正如 Lattyware 评论的那样,捕获异常并仅打印一条消息并不是一个好习惯。您应该:

  • 解决函数中的异常,以便函数继续运行并产生合理的结果(在这种情况下这是不可能的)。
  • 让程序在更高级别捕获异常。

看看我的一个程序的这个片段。这是顶层函数:

def main(argv):
    """Main program for the nc2pdf utility.

    :argv: command line arguments
    """
    if len(argv) == 1: # No filenames given, only the name of the script
        binary = os.path.basename(argv[0])
        print __proginfo__
        print "Usage: {} [file ...]".format(binary)
        print
        sys.exit(0)
    del argv[0]
    for fn in argv: # Loop over all the files
        try:
            ofn = outname(fn) # outname can raise ValueError...
            with open(fn, 'r') as inf: # Open can raise IOError
                rd = inf.read()
        except ValueError:
            fns = "Cannot construct output filename. Skipping file '{}'."
            print fns.format(fn)
            continue
        except IOError:
            print "Cannot open the file '{}'. Skipping it.".format(fn)
            continue
        ... # do something with the file's data

在这种情况下,可以通过跳过(不处理)命令行中指定的文件之一并继续处理下一个文件来处理异常。此处不处理异常会使程序崩溃,即使其他文件可能仍在处理中。文件名可能拼写错误,或者进程可能没有文件的访问权限。这些事情发生了,应该优雅地处理。

于 2013-05-22T20:23:35.767 回答
2
>>> foo = 1
>>> 
>>> def bar():
...     global foo
...     foo = 2
... 
>>> bar()
>>> foo
2

如果您不想修改全局变量,只需使用:

# Inside yourfuncs.py
def adder(a, b):
    """
    Returns the sum of a and b, or raises an exception.
    """
    try:
        return a + b
    except TypeError:
        print 'Oops'
        raise

然后:

>>> import yourfuncs
>>> x = adder(1, 2)
>>> x
3
>>> addr({}, 1)
Oops
# traceback omitted
TypeError: unsupported operand type(s) for +: 'dict' and 'int'

请注意,我没有阻止错误传播。当它起作用时不要返回总和,当它不起作用时不要返回错误字符串。那是糟糕的设计。如果您想提出自己的异常,那是个好主意。

于 2013-05-22T20:20:39.163 回答
2

要修改在函数外部声明的变量,您必须global在函数中使用关键字:

a = 1
def mod(b):
    global a
    a = b

mod(2)
print a
#prints 2

注意:这适用于不可变类型(字符串、数字、布尔值、元组),但适用于列表:

a = [1,2]
def mod(b):
    a[0] = b

mod(2)
print a
#prints [2,2]

对于您在问题正文中提到的问题(与标题完全不同),我推荐 Ronald Smith 的答案。

于 2013-05-22T20:20:47.113 回答