Python Forum
Call and execute methods from a list
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Call and execute methods from a list
#1
In command line I give as arguments script --args startApp() login() buyProduct() for example. I have a method that generates a list by given args wich are actually methods that define actions and will look like this in that case [startApp(),login(),buyProduct()].

What I have inside firstTest now, does not work. It does not throw errors, but it simply does nothing and stops.

class Tests(unittest.TestCase):

    def argsCollector(self):
        argumentsList = list()
        for i in sys.argv:
            argumentsList.append(i)
        argumentsList.pop(0)
        return argumentsList

    def firstTest(self):
        self.argsCollector()

def hagerTests():
    suite = unittest.TestSuite()
    suite.addTest(TestSuites('firstTest'))
    return suite

if __name__== "__main__":
    runner.run(hagerTests())
From here I want to give the list to the firstTest method then execute the suite that contains only one test firstTest(). Then this method when I execute the code/test should have something like this:

def firstTest():
    #somehow recive the list of steps given in cmd described above
    #then if the list received is succesfull the test can be executed because it will contain something like this
    #startApp()
    #login()
    #buyProduct()  
So how can I call and execute the methods inside my list that are given as args in cmd?
Reply
#2
I have almost reached a solution.
class TestSuites(unittest.TestCase):

    def firstHagerTest(self):
        argumentsList = [] #creates empty list
        for i in sys.argv: #iterates trough arguments and adds them to list
            argumentsList.append(i) 
        argumentsList.pop(0) #remove first argument because it's the path to the script by default
        HagercadLogger.Logger.Log(HagercadLogger.LEVEL_WARNING, "PRINT MY ARGS LIST: " + ', '.join(argumentsList)) #prints the list     
        #map(str, argumentsList)
        #results = [f() for f in argumentsList]
        try:
            func_to_run = globals()[argumentsList] #i have to find a way to make this line work as the line func_to_run2 somehow, and of course no matter the no. of elements
            #func_to_run2 = globals()[HagercadUtilities.Utilities.startApp(), HagercadSteps.Steps.createNewProject()] #this work ok 
        except KeyError:
           pass
If I execute the script with func_to_run2 where the steps are harcoded it works. But if I run with my list inside wich also contains the same steps i get and error like this:
TypeError: unhashable type: 'list'

What could be the problem?
Reply
#3
Also if i run it like this:
func_to_run = globals()[argumentsList[0],argumentsList[1]], i have no error but nothing happens so the methods are not called.

Does anyone have an idea about this? Or a solution I could try?

newStrList = [x.encode('UTF8') for x in argumentsList]
try:
#print(newStrList)
getattr(yourFile.yourClass,newStrList[0])()
getattr(yourFile.yourClass,newStrList[1])()
except KeyError:
pass


This is the solution that works for me. Of course you can iterate through the list but just to showcase the code.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  for loops break when I call the list I'm looping through Radical 4 826 Sep-18-2023, 07:52 AM
Last Post: buran
  How do I call sys.argv list inside a function, from the CLI? billykid999 3 753 May-02-2023, 08:40 AM
Last Post: Gribouillis
  How to create a linked list and call it? loves 12 4,389 Nov-22-2020, 03:50 PM
Last Post: loves
  list call problem in generator function using iteration and recursive calls postta 1 1,863 Oct-24-2020, 09:33 PM
Last Post: bowlofred
  How to call/read function for all elements in my list in python johnny_sav1992 1 2,041 Jul-27-2020, 04:19 PM
Last Post: buran
  API call returning list value of 'None' jimbone30 5 2,518 Jun-14-2019, 07:42 PM
Last Post: jimbone30

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020