jak aktivovat funkci z jiného skriptu


Odpověď 1:

Váš původní kód je:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b návrat za = func2 (4,6)tisk (a)

Existuje několik způsobů, jak toho dosáhnout:

# Použijte návratové hodnoty # Buďte explicitní, že volání func2 závisí na výsledku # volání na func1def func1 (): a = 8 b = 9 vrátit a, bdef func2 (x, y, args): a, b = * args # Rozbalit z argumentů z = x + y + a + b návrat za = func2 (4,6, args = func1 ())tisk (a)# ale můžete: a = func2 (4,6, args = (9,11)) # K vytváření dat nepotřebujete žádnou funkci

nebo

# Funkce Pass: # V tomto řešení jste při volání explicitní # func2, který potřebuje k volání func1: func1 je pomocná funkcedef func1 (): a = 8 b = 9 vrátit a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b návrat za = func2 (4,6, func1)tisk (a)# Pokud máte jinou funkci, která generuje dvojici hodnot # i to bys mohl předat

Řekl bych, že Globals vůbec nepoužívejte - vypadají jako rychlé řešení, ale je velmi špatným zvykem se do nich dostat.

Globály podle definice představují informace o tom, jak vaše funkce funguje, což je mimo argumenty vaší funkce, což může vaši funkci mnohem obtížněji otestovat - protože nyní musíte předat argumenty vaší funkci a samostatně nastavit příslušné globální hodnoty v pořadí abys otestoval svoji funkci (ty své funkce skutečně otestuješ, že ano). Někdy je nemožné uniknout globálním datům (například databázím, externím webovým serverům) a někdy musíte přeskočit obruče, abyste otestovali svůj kód, když máte externí data - ale neztěžujte si život ještě více .


Odpověď 2:

To závisí na kódu v každém souboru, ale odpověď je v podstatě stejná:

Ať už je funkce metodou objektu, nebo jednoduše nahá v modulu, můžete ji importovat odkudkoli, kde byla deklarována, kamkoli ji chcete použít.

Možná nemáte dobré důvody, abyste svou funkci nevkládali do objektu, ale možná budete chtít tento důvod ověřit. Existují rozumné argumenty pro a proti.

Pojďme nazvat soubor kódu Pythonu „modulem“. Pohodlně nám moduly Pythonu poskytují „bezplatný“ jmenný prostor, aby naše deklarace zůstaly mimo globální jmenný prostor, kde mohou kolidovat s aktuálními nebo budoucími deklaracemi jinde v kódu.

Adresářová struktura úzce souvisejících modulů se nazývá balíček.

Adresářová struktura nesouvisejících modulů se nazývá… nepořádek.

V každém případě, pokud jeden modul uložený v souboru s názvem foo.py obsahuje funkci s názvem bar:

def bar (věc1, věc2): vrátit formát „{0}, {1}“ (věc1, věc2)// v tuto chvíli to ignorujeme def yoda_speak (věc1, věc2): vrátit "{0}, {1}". formát (věc2, věc1)

... pak v jiném souboru můžete importovat funkční lištu z modulu foo:

z lišty foo importvěc = bar („importováno“, „toto“)

… Nebo můžete importovat celý modul foo, všichni získají přístup ke všem jeho funkcím najednou, pokud jste si jisti, že je budete chtít všechny… pokud na ně budete odkazovat podle jejich jmenného prostoru (např. Foo.function_name () )…

import fooboth_things = foo.bar („Opatrně s tímto“, „ale můžete importovat všechny funkce v tomto modulu“) yoda_speak = foo.anti_bar ("this is", "Backwards")

Odpověď 3:

Existuje případ, který dělá přesně to, co popisujete ve své otázce, i když to nemusí být váš případ použití. Je to * uzavření *.

def myfunction (a): b = 2 * a def myotherfunction (c): návrat b * c vrátit moji další funkci

myotherfunction efektivně uchovává kopii a, která se použije při každém vyvolání

myother = myfunction (5)result = myother (5)tisk (výsledek)

který bude tisknout: 50

Místní proměnná b je výsledkem a * 2, což v našem případě bylo 5. Toto se udržuje jako reference pro myotherfunction, což je návratová hodnota

Pokaždé, když je vrácená funkce vyvolána, vynásobí argument c hodnotou místní proměnné b, která byla uchována jako reference.


Odpověď 4:

Nabízím další způsoby, ačkoli použití třídy a metod a atributů je způsob, jak jít.

'' ' explicitní řešení, předávání informací proměnlivým. Něco takového používám pro rekurzivní programy se stavovými informacemi.'' 'importovat tiskdef f (d: dict) -> Žádný: print ('funkce f: naplnění argumentu lokálními proměnnými') a_local_variable = 'f mě vytvořil' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Žádný: tisk („FUNKCE g: VYUŽÍVÁNÍ ARGUMENTU S MÍSTNÍMI PREMENNÝMI VYTVOŘENÉ JINDE“) pprint.pprint (d)def main (): pass_variables_around = {} f (pass_variables_around) g (pass_variables_around)hlavní()

Odpověď 5:
proměnná = 0def modify_global (): globální proměnná proměnná + = 1tisková proměnná>>>> 1

Globální klíčové slovo umožňuje lokální modifikaci globálních proměnných ve funkci.

Definování funkce uvnitř jiného nepředá hodnotu stejných pojmenovaných proměnných. Překontrolovat

9. Třídy - dokumentace k Pythonu 3.7.0

části 9.1 a 9.2 pro pěkné krátké vysvětlení toho, jak pojmenování funguje v Pythonu.


Odpověď 6:
def func1 (): globální a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b návrat za = func2 (4, 6)tisk (a)#Jsem v pythonu nový, takže si nejsem jistý, jestli je to nejlepší řešení. Ale toto je jedno z řešení.V zásadě musíte proměnit proměnné a a b na globální a zároveň je deklarovat, pokud je chcete použít v jiné funkci.

Odpověď 7:

Nejsem si jistý, zda rozumím tomu, co máte na mysli. Pokud ale importujete funkci z jednoho souboru do jiného, ​​může importér předat funkci funkci a funkce může aktualizovat cokoli ve svém vlastním souboru.

Pokud však správně rozumím (a je docela pravděpodobné, že tomu tak není), snažíte se v mnoha případech o velmi špatnou programovací praxi, která se spoléhá na globální moduly.


Odpověď 8:

I když určitě existují způsoby, nedělejte to. Pokud byste chtěli upravit některé hodnoty uvnitř funkce a použít tyto upravené hodnoty v jiné funkci, předejte hodnoty, které mají být změněny, první funkci pomocí parametrů vyvolání a přijměte upravené hodnoty jako návratovou hodnotu funkce. Předejte upravené hodnoty druhé funkci a přijměte její návratové hodnoty.

Toto je obecně přijímaný osvědčený postup z paradigmatu funkčního programování, který se pokouší minimalizovat (neočekávaně to není zřejmé) vedlejší účinky volání funkce.


Odpověď 9:

Zadaný kód způsobí chyby.

Proč? Kvůli tomu, jak fungují proměnné obory v Pythonu. a a b, deklarované v func (), stačí ovlivnit tuto funkci, to je jejich rozsah.

Pokud chcete upravit hodnoty globální proměnné uvnitř funkce, musíte použít globální klíčové slovo:

globální xx = 123tisk xfunc ()tisk xdef func (): x = 124

tl; dr Váš kód, jak je, nebude fungovat.


Odpověď 10:

Ano, to je to, co hledáte. Doufám, že to pomůže.

def c (): r = raw_input ("Zeptat se na něco?") ... návrat rdef p (x): ... dělej něco ....r = c ()p (r)