问题
在 Python 3.x 中运行 MRJob 类自定义代码。 MRJob 类已定义。 Jyputer Notebook 中的单元测试在单元测试中运行良好。将 Jyputer Notebook 保存到 Python .py 文件中,以便在控制台上运行以进行最终单元测试。
寻求有关configure_args对象上super的类型错误的帮助,以及我做错了什么,没有让实例对象成为JoinJob()对象的正确实例或子类型。
运行类实例的主流程
在 JoinJoin() 类上发出一个新的对象实例:
instance = JoinJob()
instance.testJob()
班级 class JoinJob() 定义了一个函数,configure_args,这是类方法定义。
def configure_args(self)
类型错误第 122 行区域
此类 MapReduceJoinJob 是 MRJob 的子类,并在 /// 第 122 行 /// 处引发类型错误。可以看出,configure_args() 的函数定义已正确设置为在主类 JoinJob 及其定义的 configure_args() 上发出 super 来覆盖它。但是,在此示例中没有自定义自定义覆盖代码。
class MapReduceJoinJob(MRJob):
OUTPUT_PROTOCOL = RawValueProtocol
/// line 122 ///
def configure_args(self):
super(JoinJob, self).configure_args()
在主Python例程中,通过创建MapReduceJoinJob()的新实例来调用驱动程序类MapReduceJoinJob(),然后处理和调用
if __name__ == "__main__":
driver_reduce_join()
instance = MapReduceJoinJob() #// This is the area of Type Error
错误
TypeError: super(type, obj): obj must be an instance or subtype of type
line 122, in configure_args
super(JoinJob, self).configure_args()
TypeError: super(type, obj): obj must be an instance or subtype of type
MRJob类定义
# MRJob MapReduce using MRJob (MRUnit in Python)
# MRJob / MRUnit Test unit class
class JoinJob():
///line 122///
def configure_args(self):
JoinJob.configure_args()
def showResults(self, df_h_data, df_v_data, combine_row):
print('MRJob Test Case : Columns from Dataset Homocides Non-Fatal')
print('\n')
df_h_data['HOMICIDE'].iloc[:9]
print(df_h_data)
print('MRJob Test Case : Columns from Dataset Victim Demographics')
print('\n')
df_v_data['HOMICIDE'].iloc[:8]
print('MRJob Test Case : Combined Map Reduced Dataset Homocides Non-Fatal & Victim Demographics')
print('\n')
combine_row
print(combine_row)
# test classs function
def testJob(self):
h_data, v_data = MapReduceJoin()
combined_row = CombineDatasets(h_data, v_data)
df_combine_row = pd.DataFrame(combined_row)
by='BATTERY'
combine_row = SortVictimData(df_combine_row, sort_order=False, column=by)
df_h_data = pd.DataFrame(h_data)
df_v_data = pd.DataFrame(v_data)
self.showResults(df_h_data, df_v_data, combine_row)
#%%
# MRJob MapReduce using MRJob (MRUnit in Python)
# Test: test differnt row filter, test sort
class MapReduceJoinJob(MRJob):
OUTPUT_PROTOCOL = RawValueProtocol
def configure_args(self):
super(JoinJob, self).configure_args()
instance = JoinJob()
instance.testJob()
super(type, obj)
super()
函数有助于确保调用超类中的适当方法。这里是如何理解
super(type, obj)
type:这是您要开始搜索方法的类。通常是您当前所在的子类(子类)。
obj:这是当前对象的实例。它是您要从中调用超类方法的子类的实例。
TypeError: super(type, obj): obj 必须是 的实例或子类型 类型这是合乎逻辑的,因为 self 与
JoinJob
没有任何关系(不继承自 JoinJob)。这是问你关于
MRJob
的实现的重点,只是为了看看
MRJob
和
JoinJob
类之间是否存在关系。
RecursionError
中爆炸?
class JoinJob():
def configure_args(self):
JoinJob.configure_args() # very dangerous - circular ependency
您的 MapReduceJoinJob
中这个调用
super(JoinJob, self).configure_args()
的要点是什么?如果你想调用 MRJob 的实现,你只需要super().configure_args()
,假设父类也有它。我希望能有所帮助,祝你好运:)