Function variable scope in python

徘徊边缘 提交于 2021-02-05 09:38:26

问题


let's say we have two functions:

def ftpConnect(): 
    ftp = FTP('server')
    ftp.login()
    ftp.cwd('/path')

def getFileList():
    ftpConnect()
    files = ftp.nlst()
    print(files)

If I call the getFileList() function it won't work because it doesn't know the ftp var.

I know that if I declare the ftp variable inside ftpConnect() function as global it will work, but I was wondering if there is a better / more elegant way of doing it.


回答1:


In my opinion, the most elegant solution would be to make a FTP-class, which would have the ftp-variable as a private attribute.

class FTPConnection(object):
    def __init__(self, server):
        self._ftp = FTP(server)

    def connect(self): 
       self._ftp.login()
       self._ftp.cwd('/path')


    def getFileList():
        files = self._ftp.nlst()
        print(files)

ftp = FTPConnection('server')
ftp.connect()
ftp.getFileList()



回答2:


Functions can return values. Return values are cool!

Return ftp from ftpConnect():

def ftpConnect(): 
    ftp = FTP('server')
    ftp.login()
    ftp.cwd('/path')
    # return the value of `ftp` to the caller
    return ftp

def getFileList():
    # assign the return value of `ftpConnect` to a new local variable
    ftp = ftpConnect()
    files = ftp.nlst()
    print(ftp.nlst())

You may also want to look in to object-oriented programming techniques; define a class that handles all your FTP-related operations, and store the FTP server connection as an attribute of the instance.




回答3:


Return ftp from ftpConnect() and assign the return value to a variable named ftp:

def ftpConnect(): 
    ftp = FTP('server')
    ftp.login()
    ftp.cwd('/path')
    return ftp         #return ftp from here

def getFileList():
    ftp = ftpConnect() # assign the returned value from the
                       # function call to a variable
    files = ftp.nlst()
    print(ftp.nlst())


来源:https://stackoverflow.com/questions/17573611/function-variable-scope-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!