Python - volání funkce z proměnné

JanNovak

Python - volání funkce z proměnné
« kdy: 10. 05. 2018, 17:17:37 »
Ahoj,

mám poměrně dost začátečnickou otázku. Potřeboval bych volat funkci (nebo nějakou metodu) z proměné. Řekněmě, že mám několik funkcí jejiž jména mám v seznamu a tyto funkce bych chtěl postupně volat nějakým cyklem. Příklad:


"""Takhle to samozřejmě nefunguje """
seznamFunkci = [ "funkce1", "funkce2", "funkce3"]
for i in seznamFunkci:
     seznamFunkci[i]()


Jak bych to měl udělat?


gogo

Re:python - volání funkce z proměné
« Odpověď #1 kdy: 10. 05. 2018, 17:29:40 »
zalezi na co to chces.
treba:
seznamFunkci = [ funkce1, funkce2 ]
for i in seznamFunkci:
  i()


nebo:
seznamFunkci = [ 'funkce1', 'funkce2' ]
for i in seznamFunkci:
  globals()()

gogo

Re:python - volání funkce z proměné
« Odpověď #2 kdy: 10. 05. 2018, 17:32:49 »
jsem jelito. ta druha verze ma vypadat tak:

seznamFunkci = [ 'funkce1', 'funkce2' ]
for i in seznamFunkci:
  globals()[i]()

gll

  • ****
  • 429
Re:python - volání funkce z proměné
« Odpověď #3 kdy: 10. 05. 2018, 17:33:07 »
jména funkcí napište bez uvozovek

JanNovak

Re:Python - volání funkce z proměnné
« Odpověď #4 kdy: 10. 05. 2018, 17:55:24 »
Super to by šlo. Není to uplně estetické, ale funguje to. Jen to nefunguje při volání metody:
nazevTridy.globals()[i]()


JanNovak

Re:Python - volání funkce z proměnné
« Odpověď #5 kdy: 10. 05. 2018, 18:43:22 »

class myClass:
      def f1(self):
            print("funguje to")

var = "f1" # nazev funkce ve třídě myClass
m = myClass()

""" ________________ """

m.var() # nefunguje
m.globals()[var]() # nefunguje


Potřeboval bych nějak nasměrovat. Vůbec ani nevím pod čím bych odpověď měl hledat.

gll

  • ****
  • 429
Re:Python - volání funkce z proměnné
« Odpověď #6 kdy: 10. 05. 2018, 19:01:28 »
Citace od: JanNovak kdy 10. 05. 2018, 18:43:22
Potřeboval bych nějak nasměrovat. Vůbec ani nevím pod čím bych odpověď měl hledat.

__dict__

https://docs.python.org/3/reference/datamodel.html

gll

  • ****
  • 429
Re:Python - volání funkce z proměnné
« Odpověď #7 kdy: 10. 05. 2018, 19:03:06 »


class myClass:
      def f1(self):
            print("funguje to")

var = "f1" # nazev funkce ve třídě myClass
m = myClass()

m.__dict__[var]()


BoneFlute

  • *****
  • 2 155
Re:Python - volání funkce z proměnné
« Odpověď #8 kdy: 10. 05. 2018, 19:09:16 »
- máš-li název funkce, hledáš v patřičném slovníku
- znáš-li funkci, a jen ji chceš předávat, tak ji normálně použiješ, ale bez závorek
- funkci, kterou máš uloženou v proměnné zavoláš tak, že jí dáš závorky.


def a():
   return "A"

def b():
   return "B"

class Klass:
   def m(self):
      return "C"

inst = Klass()

xs = [a, b, inst.m]

for m in xs:
   print m()
print globals()["a"]()
print globals()["b"]()
print getattr(inst, "a")()

gll

  • ****
  • 429
Re:Python - volání funkce z proměnné
« Odpověď #9 kdy: 10. 05. 2018, 19:11:21 »
getattr je lepší než moje rada s __dict__

JanNovak

Re:Python - volání funkce z proměnné
« Odpověď #10 kdy: 11. 05. 2018, 09:58:33 »
gll, BoneFlute: To je super... moc vám děkuju.