有人可以告诉我为什么下面的单元测试在test_bad中的ValueError上失败了,而不是用assertRaises捕获它并成功吗?我想我正在使用正确的过程和语法,但ValueError没有被捕获.
我在Linux机器上使用Python 2.7.5.
这是代码......
import unittest
class IsOne(object):
def __init__(self):
pass
def is_one(self, i):
if (i != 1):
raise ValueError
class IsOne_test(unittest.TestCase):
def setUp(self):
self.isone = IsOne()
def test_good(self):
self.isone.is_one(1)
self.assertTrue(True)
def test_bad(self):
self.assertRaises(ValueError, self.isone.is_one(2))
if __name__ == "__main__":
unittest.main()
Run Code Online (Sandbox Code Playgroud)
这是单元测试的输出:
======================================================================
ERROR: test_bad (__main__.IsOne_test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test/raises.py", line 20, in test_bad
self.assertRaises(ValueError, self.isone.is_one(2))
File "test/raises.py", line 8, in is_one
raise ValueError
ValueError
----------------------------------------------------------------------
Ran 2 tests in 0.008s
FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud) 是否可以使用getattr/ setattr来访问类函数中的变量?
以下示例.说我有一个A级,具有两个方法,func1以及func2这两者的定义一个变量count是不同类型的.有没有办法getattr在func2中使用
来访问局部变量count?
实际上,我有很多变量func2(也有不同的定义func1),我想循环使用,我希望通过使用getattr变量名循环来缩短我的代码.
class A(object):
def __init__(self):
pass
def func1(self):
count = {"A": 1, "B":2}
def func2(self):
count = [1, 2]
mean = [10, 20]
for attr in ("count", "mean"):
xattr = getattr(self, attr) ! What do I put in here in place of "self"?
xattr.append(99)
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个高度模块化的 Python 日志系统(使用日志模块),并在日志消息中包含来自跟踪模块的信息。
例如,我希望能够编写如下一行代码:
my_logger.log_message(MyLogFilter, "this is a message")
Run Code Online (Sandbox Code Playgroud)
并让它包括对“log_message”调用位置的跟踪,而不是实际的记录器调用本身。
除了跟踪信息来自logging.debug()调用而不是调用之外,我几乎可以使用以下代码my_logger.log_message()。
class MyLogFilter(logging.Filter):
def __init__(self):
self.extra = {"error_code": 999}
self.level = "debug"
def filter(self, record):
for key in self.extra.keys():
setattr(record, key, self.extra[key])
class myLogger(object):
def __init__(self):
fid = logging.FileHandler("test.log")
formatter = logging.Formatter('%(pathname)s:%(lineno)i, %(error_code)%I, %(message)s'
fid.setFormatter(formatter)
self.my_logger = logging.getLogger(name="test")
self.my_logger.setLevel(logging.DEBUG)
self.my_logger.addHandler(fid)
def log_message(self, lfilter, message):
xfilter = lfilter()
self.my_logger.addFilter(xfilter)
log_funct = getattr(self.logger, xfilter.level)
log_funct(message)
if __name__ == "__main__":
logger = myLogger()
logger.log_message(MyLogFilter, "debugging")
Run Code Online (Sandbox Code Playgroud)
为了进行简单的logging.debug调用,要经历很多麻烦,但实际上,我将MyLogFilter …