简体   繁体   中英

python calling a def() inside of def()

I'm making a package for my python assistant and have found a problem.

Im importing the following program into the main script.

import os

def load() :
    def tts(name) :
        os.system("""PowerShell -Command "Add-Type –AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak(' """ + name + " ');"

how do i call the function into my program

ive tried:

import loadfile
loadfile.load().tts("petar")

and it didn't work

You are never supposed to expose a sub-function outside of its scope, in this case, the tts method outside load . It's actually imposible to access tts without exposing its reference outside of your load() method. I suggest you to rather use a class like this:

In loadfile.py :

import os

class LoadFile(object):
    def tts(self, name):
        os.system("""PowerShell -Command "Add-Type –AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak(' """ + name + " ');")

def load():
    return LoadFile()

On main code: import loadfile loadfile.load().tts("petar")

When you run loadfile.load().tts("petar") , it is equivalent to:

v = loadfile.load()
v.tts("petar")

Your method loadfile.load() does not return any value, so v is assigned None . Then you try to call tts() against None , which is an error.

Why are you trying to do this? Maybe you want to create a class?

you can follow this code to call def within def

def num1(x):
   def num2(y):
      return x * y
   return num2
res = num1(10)

print(res(5))

Reference URL

You also can use the decorator "@classmethod" to create some funcion inside your class that doesn't need create an instance of your class.

In your "my_package.py" file you can do some like this:

class Loaders():

   @classmethod
   def load(self, parameter):
      return self.tts(parameter)

   def tts(self):
      os.system("""PowerShell...""")
      ...
      return self

In python files that will call this "my_package.py" you can code:

       filename        classname
          |                |
          V                V
from my_package import Loaders

# to use your method tts you can Instantiate your class and after call the method:
x = Loaders()
x.tts('petar')

# or you can call directly some classmethod
x = Loaders.load('petar')

If you need change the steps when initializing your class, ... you can edit the instantiation method init


class Loaders():

   def __init__(self, some_param):
      ...do something...

      return self

...
# so when you when you call 
x = Loaders()

# " ... do something ..." will do and the class object (self) will return.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM