如何在python中访问函数内部声明的变量[duplicate]

yquaqz18  于 2022-12-25  发布在  Python
关注(0)|答案(3)|浏览(166)
    • 此问题在此处已有答案**:

How do I get a result (output) from a function? How can I use the result later?(4个答案)
6个月前关闭。
下面的代码读取配置文件并将结果以列表形式存储在一些变量中

import ConfigParser

def read_config_file():
    config = ConfigParser.ConfigParser()
    cnf_path = 'config_files/php.sr'
    config.read(cnf_path)
    if config.has_section('basic'):
        if config.has_option('basic', 'basic'):
            php_bsc_mdls = config.get('basic', 'basic').split(',')
    if config.has_section('advance'):
        if config.has_option('advance','advance'):
            php_adv_mdls = config.get('advance', 'advance').split(',')

现在,我想从类似read_config_file.php_bsc_mdlsread_config_file.php_adv_mdls的函数中获取结果变量php_bsc_mdlsphp_adv_mdls
那么是否可以从python函数中访问/获取变量呢?

mutmk8jj

mutmk8jj1#

你只需要返回它们,当函数结束时它们就不存在了。

def read_config_file():
    config = ConfigParser.ConfigParser()
    cnf_path = 'config_files/php.sr'
    config.read(cnf_path)
    if config.has_section('basic'):
        if config.has_option('basic', 'basic'):
            php_bsc_mdls = config.get('basic', 'basic').split(',')
    if config.has_section('advance'):
        if config.has_option('advance','advance'):
            php_adv_mdls = config.get('advance', 'advance').split(',')

    if php_bsc_mdls and php_adv_bls:
        return php_bsc_mdls,php_adv_mdls
    elif php_bsc_mdls:
        return php_bsc_mdls, None

另一种方法是创建一个类,将它们保存到类变量中,然后从类中获取这些值,而不是从函数中。
或者像这样:

def read_config_file():
    php_bsc_mdls = None
    php_adv_mdls = None
    config = ConfigParser.ConfigParser()
    cnf_path = 'config_files/php.sr'
    config.read(cnf_path)
    if config.has_section('basic'):
        if config.has_option('basic', 'basic'):
            php_bsc_mdls = config.get('basic', 'basic').split(',')
    if config.has_section('advance'):
        if config.has_option('advance','advance'):
            php_adv_mdls = config.get('advance', 'advance').split(',')

    return php_bsc_mdls, php_adv_mdls

在这两种情况下,你都需要检查你调用函数的返回值,如果值为无或否。

rqdpfwrv

rqdpfwrv2#

def read_config_file():
  php_bsc_mdls, php_adv_mdls = None, None # Init to None.
  ...
  return php_bsc_mdls, php_adv_mdls # Return at end.

# Get results
basic, advanced = read_config_file()

或者,你可以为这个创建一个类。

class Config:
  php_adv_mdls = None
  php_bsc_mdls = None
  @staticmethod
  def read_config_file():
    if not Config.php_adv_mdls and not Config.php_bsc_mdls:
      # Load the data here.
      config = ConfigParser.ConfigParser()
      ...
      Config.php_adv_mdls = config.get...
      Config.php_bsc_mdls = config.get...

使用类变量和静态方法加载配置文件 * 一次 *。

Config.php_adv_mdls # None
Config.read_config_file() # Loads the data from config.
Config.read_config_file() # Will only attempt another load if either 
                          # class variable in not valid.
Config.php_bsc_mdls       # If successful, will be initialize with data.
eyh26e7m

eyh26e7m3#

正如有人所说,这样做是合理的回报。
但是...
在python中函数是对象,所以你可以这样做smth:

def a():
    a.x = 10

a()
print a.x    # >> 10

最后一个虽然不是好代码的例子,在这种情况下。

相关问题