I need to develop a demo ETL system that need to run from following fluent python format
ETL().source(source_args).sink(sink_args).run()
I made the class ETL()
after this I made a function source
and function sink
in the class.
Code looks like this:
class ETL:
def source(self, data_source: str):
if data_source == 'Simulation':
simulation()
elif data_source == 'File':
main()
def sink(self, data_sink: str):
if data_sink == 'Console':
command = 'Continue'
user_command = input('Please type to Continue or to Stop!')
while command != 'Stop':
simulation()
else:
pass
ETL().source('Simulation').sink('Console')
When I run the file I receive this error:
AttributeError: ‘NoneType’ object has no attribute ‘sink’
Where I am wrong and how to add the last method .run()
?
I take simulation()
function from another file but this is not the problem.
Advertisement
Answer
You’ve found the answer anyway, but I’ll just add some return self
to your code:
class ETL:
def source(self, data_source: str):
if data_source == 'Simulation':
simulation()
elif data_source == 'File':
main()
return self
def sink(self, data_sink: str):
if data_sink == 'Console':
command = 'Continue'
user_command = input('Please type to Continue or to Stop!')
while command != 'Stop':
simulation()
return self
ETL().source('Simulation').sink('Console')
The above code will now work without the error.
However, you also ask about the run()
method. I want to know what that is supposed to do. To me it looks like the sink()
method, having a while
loop is doing the run thing.
Perhaps you meant to do this:
# code elided ...
def sink(self, data_sink: str):
self.data_sink = data_sink
return self
def run(self):
if self.data_sink == 'Console':
command = 'Continue'
user_command = input('Please type to Continue or to Stop!')
while command != 'Stop':
simulation()
# Now this will work:
ETL().source(source_args).sink(sink_args).run()