从python中的另一个函数调用嵌套函数?

时间:2018-06-10 17:29:45

标签: python

我在另一个和第三个函数里面有一个函数。如何在第三个函数中调用嵌套函数?我可以使用任何特殊的库吗?我不能编辑()或b(),只能编辑c()。

def a():
    def b():
        print("hi")

def c():
    # code only here to call b() to print

2 个答案:

答案 0 :(得分:0)

由于Python作用域的工作方式,这是不可能的。 b()是a()的局部,因此在c()中不存在。

编辑:评论者是正确的,我最初给出的建议不起作用 - 所以这绝对不可能。

答案 1 :(得分:0)

执行此操作时,函数ba内本地定义。这意味着默认情况下无法在a之外访问它。有两种主要方法可以解决这个问题,但都涉及修改a

  1. global关键字(不推荐)

    def a():
        global b
        def b():
            print("hi")
    

    此处global关键字将b设置为全局变量,以便您可以通过c内的正常调用来访问它。 This is generally frowned upon.

  2. a返回功能并将其传递给c

    def a():
        def b():
            print("hi")
        return b
    
    def c(b):
        #your code
    

    然后,当您致电c时,您应该将b传递给ab = a() c(b) 将返回该a。你可以这样做:

    c

    或者,每次拨打c(a()) 时,您都可以致电c,因此:

    def c():
        b = a()
        #your code here
    

    如果您选择这样做,则可以定义c

    `c()`
    

    这将允许您简单地正常呼叫@Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } ,因此:

    // Prepare Blob support
    const Blob = RNFetchBlob.polyfill.Blob;
    
    const fs = RNFetchBlob.fs;
    window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest;
    window.Blob = Blob;
    
    uploadImage = (uri, imageName, mime = "image/jpg") => {
        return new Promise((resolve, reject) => {
          const uploadUri =
            Platform.OS === "ios" ? uri.replace("file://", "") : uri;
          let uploadBlob = null;
          const imageRef = db
            .storage()
            .ref("images/")
            .child(imageName);
    
      fs.readFile(uploadUri, "base64")
        .then(data => {
          return Blob.build(data, { type: `${mime};BASE64` });
        })
        .then(blob => {
          uploadBlob = blob;
          alert("blob is " + JSON.stringify(blob));
          return imageRef.put(blob, { contentType: mime });
        })
        .then(() => {
          uploadBlob.close();
          return imageRef.getDownloadURL();
        })
        .then(url => {
          resolve(url);
        })
        .catch(error => {
          reject(error);
        });
    });};