Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 ricree
ricree

De asteptare o funcție de un modul de folosind numele acestuia (un șir de caractere)

Ceea ce este cel mai bun mod de a merge despre apelarea unei funcții dat un șir de caractere cu funcția's nume într-un program in Python. De exemplu, să's spun că am un modul de "foo", și am un șir de caractere al căror conținut este"bar". Ceea ce este cel mai bun mod de a sunafoo.bar()`?

Am nevoie pentru a obține valoarea returnată de funcție, care este de ce eu nu't de a folosi doar "eval". Mi-am dat seama cum să o facă prin utilizarea "eval" pentru a defini o temp funcție care returnează rezultatul acestui apel de funcție, dar nu'm sperând că nu există un mod mai elegant de a face acest lucru.

1553 2008-08-06T03:36:08+00:00 12
Programare
python
object
Comentarii la întrebare (0)
Soluția
Patrick Johnmeyer
Patrick Johnmeyer
6 august 2008 в 3:57
2008-08-06T03:57:16+00:00
Mai mult
Sursă
Editează
#8408535

Presupunând că modulul " foo "cu metodă "bar":

method_to_call = getattr(foo, 'bar')
result = method_to_call()

Ai putea scurta liniile 2 și 3:

în cazul în care face mai mult sens pentru cazul dumneavoastră de utilizare.

Puteți utiliza getattr în acest mod la clasă exemplu legat metode, module la nivel de metode, metode de clasă... lista poate continua.

1861
0
Comentarii (12)
 sastanin
sastanin
7 mai 2009 в 12:45
2009-05-07T12:45:13+00:00
Mai mult
Sursă
Editează
#8408537

sau

localnici returnează un dicționar cu un curent local tabela de simboluri. globals returnează un dicționar cu simbolul global de masă.

494
0
Comentarii (4)
 HS.
HS.
7 august 2008 в 11:35
2008-08-07T11:35:23+00:00
Mai mult
Sursă
Editează
#8408536

Patrick's soluție este, probabil, cel mai curat. Dacă aveți nevoie pentru a dinamic ridica modulul fel de bine, puteți să-l importați, cum ar fi:

func = getattr(module, 'bar')
func()
308
0
Comentarii (6)
 Sourcegeek
Sourcegeek
19 august 2012 в 9:40
2012-08-19T09:40:43+00:00
Mai mult
Sursă
Editează
#8408539

Doar o simplă contribuție. În cazul în care clasa de care avem nevoie spre exemplu, este în același fișier, putem folosi ceva de genul asta:

m = globals()['our_class']()

# Get the function (from the instance) that we need to call
func = getattr(m, 'function_name')

# Call it
func()

De exemplu:

    def __init__(self):
        pass

    def sampleFunc(self, arg):
        print('you called sampleFunc({})'.format(arg))

m = globals()['A']()
func = getattr(m, 'sampleFunc')
func('sample arg')

# Sample, all on one line
getattr(globals()['A'](), 'sampleFunc')('sample arg')

Și, dacă nu o clasă:

    print('you called sampleFunc({})'.format(arg))

globals()['sampleFunc']('sample arg')
99
0
Comentarii (0)
 ferrouswheel
ferrouswheel
16 octombrie 2013 в 12:24
2013-10-16T00:24:22+00:00
Mai mult
Sursă
Editează
#8408541

Dat un șir de caractere, cu un completați calea python pentru o funcție, acest lucru este cum m-am dus despre obtinerea rezultatul a declarat funcție:

function_string = 'mypackage.mymodule.myfunc'
mod_name, func_name = function_string.rsplit('.',1)
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
result = func()
89
0
Comentarii (1)
Utilizator anonim
24 octombrie 2016 в 1:20
2016-10-24T13:20:46+00:00
Mai mult
Sursă
Editează
#8408543

Cel mai bun răspuns potrivit de programare Python FAQ ar fi:


mystring = 'myfoo'
if mystring in functions:
    functions[mystring]()

principalul avantaj al acestei tehnici este faptul că siruri de caractere nu au nevoie pentru a se potrivi numele de funcții. Acest lucru este, de asemenea, principala tehnică utilizată pentru a emula un caz construct

46
0
Comentarii (0)
 00500005
00500005
9 aprilie 2014 в 10:17
2014-04-09T10:17:41+00:00
Mai mult
Sursă
Editează
#8408542

Raspunsul (sper) nimeni nu a vrut

Eval astfel de comportament

De ce nu-l adăugați auto-importul

    locals().get("foo") or 
    globals().get("foo") or
    __import__("foo"), 
"bar")()

În cazul în care avem dicționare suplimentare vrem să verificăm

                          [locals().get, globals().get, 
                           self.__dict__.get, __import__]) 
              if x)),
"bar")()

Trebuie să mergem mai adânc

              ([locals().get, globals().get, self.__dict__.get] +
               [d.get for d in (list(dd.values()) for dd in 
                                [locals(),globals(),self.__dict__]
                                if isinstance(dd,dict))
                if isinstance(d,dict)] + 
               [__import__])) 
        if x)),
"bar")()
37
0
Comentarii (0)
 trubliphone
trubliphone
14 februarie 2012 в 5:55
2012-02-14T05:55:36+00:00
Mai mult
Sursă
Editează
#8408538

Pentru ce-l's valoare, dacă aveți nevoie pentru a trece funcția (sau clasa) numele și numele app ca un șir de caractere, atunci ai putea face acest lucru:

myAppName = "MyApp"
app = sys.modules[myAppName]
fn  = getattr(app,myFnName)
23
0
Comentarii (1)
 tvt173
tvt173
7 decembrie 2016 в 6:29
2016-12-07T18:29:30+00:00
Mai mult
Sursă
Editează
#8408544

Încercați acest lucru. În timp ce aceasta încă mai folosește eval, se folosește numai la convoca în funcție de contextul actual. Apoi, aveți o funcție reală de a folosi cum doriti.

Principalul beneficiu pentru mine de la acest lucru este că veți obține orice eval-erori legate la punctul de citarea funcției. Atunci veți obține numai funcția legate de erori atunci când te sun.

    print 'Hello {}!'.format(name)

# get the function by name
method_name = 'say_hello'
method = eval(method_name)

# call it like a regular function later
args = ['friend']
kwargs = {}
method(*args, **kwargs)
18
0
Comentarii (4)
 Natdrip
Natdrip
28 decembrie 2012 в 4:56
2012-12-28T16:56:45+00:00
Mai mult
Sursă
Editează
#8408540

nimic din ceea ce a fost sugerat m-a ajutat. Am descoperit acest lucru, deși.

Eu sunt, folosind python 2.66

Sper că acest lucru vă ajută

14
0
Comentarii (4)
 Serjik
Serjik
26 martie 2019 в 6:15
2019-03-26T18:15:53+00:00
Mai mult
Sursă
Editează
#8408545

Ca această întrebare Cum pentru a dinamic a apela metode dintr-o clasă folosind metoda-numele misiune la o variabilă [duplicat] a marcat ca un duplicat ca asta, eu sunt de a posta un legate de răspunsul aici:

Scenariul este, o metodă într-o clasă doriți pentru a apela o altă metodă pe aceeași clasă dinamic, am adăugat unele detalii originale exemplu care oferă un scenariu mai amplu și claritate:

    def __init__(self, i):
        self.i = i

    def get(self):
        func = getattr(MyClass, 'function{}'.format(self.i))
        func(self, 12)   # This one will work
        # self.func(12)    # But this does NOT work.

    def function1(self, p1):
        print('function1: {}'.format(p1))
        # do other stuff

    def function2(self, p1):
        print('function2: {}'.format(p1))
        # do other stuff

if __name__ == "__main__":
    class1 = MyClass(1)
    class1.get()
    class2 = MyClass(2)
    class2.get()

de Ieșire (Python 3.7.x)

function1: 12

function2: 12

0
0
Comentarii (0)
Number File
Number File
28 august 2019 в 4:46
2019-08-28T16:46:12+00:00
Mai mult
Sursă
Editează
#8408546

Acesta este un răspuns simplu, acest lucru vă va permite pentru a goli ecranul, de exemplu. Există două exemple de mai jos, cu eval și executiv, care se va imprima 0 în partea de sus după curățare (daca're folosind Windows, schimbare "clear" pentru a cls, Linux și Mac, utilizatorii lăsați așa cum este, de exemplu) sau doar executa, respectiv.

exec("os.system(\"clear\")")
-1
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RO
RU
© Answer-ID 2021
Sursă
https://stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire