请原谅我的菜鸟状态,但我遇到了一个我不太懂的构造,希望有人能为我解释。
class Base(object):
def mogrify(self, column):
return self.mogrifiers.get(column.lower().strip()) or (lambda x: x)
...
class MyClass(some.package.Base):
def mogrifiers(self):
return {
'column1': (lambda x: datetime.datetime.fromtimestamp(int(x)))
}
...
class MyOtherClass(object):
def convert_columns:
...
new_row[colkey] = self.myclass.mogrify(colkey)(value)
这一切都有效,但我正在尝试编写单元测试并模拟MyClass
。
据我所知,mogrifiers返回所有列的字典和所需的任何转换。
我正在测试的代码调用 mogrify (继承自Base类),并在字符串中使用特定的列名称。
这会尝试从字典中提取列并返回lambda函数吗?或者如果它不存在于字典中,它会返回一个只返回字符串的lambda?
这样我只需要在代码I中尝试测试(value)位。它不清楚它的作用。
如果我不想测试底层的转换/转换,我的模拟就可以返回简单的lambda。
所以我已经这样做了,但它在mogrify的调用中抛出异常说:
E TypeError:' str'对象不可调用
任何人都能提供一些我在这里失踪的线索吗?
答案 0 :(得分:1)
据我所知,mogrifiers返回所有的字典 列和所需的任何转换。
这是正确的,但正如你已经证明的那样,它每次都会创建一个新词典,这似乎是不必要的。
我正在测试的代码调用mogrify(继承自Base类) 在字符串中使用特定的列名。
这会尝试从字典中提取列并返回 lambda函数?或者如果它不存在于字典中,则返回 一个lambda,只是给了回来的字符串?
是的,这也是正确的(除了lambada是一种舞蹈,但我认为你的意思是lambda)。
这样我就可以在代码I中尝试使用(值)位 测试。它不清楚它的作用。
来电self.myclass.mogrify(colkey)
会返回一个可调用的,(value)
只是调用它。如果我这样重写可能会更清楚:
fn = self.myclass.mogrify(colkey)
new_row[colkey] = fn(value)
将其分成两行也可以更清楚地解决问题是调用self.myclass.mogrify(colkey)
还是fn(value)
。如果似乎是fn(value)
调用它意味着你的模拟mogrify返回str
而不是返回一个可调用的;然而,它可能是你得到了模拟错误而且模拟的mogrify
方法实际上是一个字符串。
我建议你重写如图所示,并在两行之间插入print
,看看实际返回的是什么。