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:

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

Jak bych to měl udělat?
« Poslední změna: 10. 05. 2018, 17:31:09 od Petr Krčmář »


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:
Kód: [Vybrat]
seznamFunkci = [ 'funkce1', 'funkce2' ]
for i in seznamFunkci:
  globals()[i]()

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
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:
Kód: [Vybrat]
nazevTridy.globals()[i]()


JanNovak

Re:Python - volání funkce z proměnné
« Odpověď #5 kdy: 10. 05. 2018, 18:43:22 »
Kód: [Vybrat]
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
    • Zobrazit profil
    • E-mail
Re:Python - volání funkce z proměnné
« Odpověď #6 kdy: 10. 05. 2018, 19:01:28 »
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
    • Zobrazit profil
    • E-mail
Re:Python - volání funkce z proměnné
« Odpověď #7 kdy: 10. 05. 2018, 19:03:06 »

Kód: [Vybrat]
class myClass:
      def f1(self):
            print("funguje to")

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

m.__dict__[var]()

BoneFlute

  • *****
  • 2 044
    • Zobrazit profil
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
    • Zobrazit profil
    • E-mail
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.