【问题标题】:How to access the variables declared inside functions in python如何访问python函数内部声明的变量
【发布时间】:2013-02-18 07:40:22
【问题描述】:

我有以下代码读取配置文件并将结果作为列表存储在一些变量中

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(',')

现在我想从函数中获取结果变量 php_bsc_mdlsphp_adv_mdls 类似read_config_file.php_bsc_mdlsread_config_file.php_adv_mdls

那么是否可以从 python 函数中访问/获取变量?

【问题讨论】:

  • return (php_bsc_mdls, php_adv_mdls)
  • 当我尝试像 read_config_file.php_bsc_mdls 一样访问时,我得到了这个错误 AttributeError: 'function' object has no attribute 'php_bsc_mdls'
  • 视情况而定,从根本上说,python 中有一种方法可以访问函数的本地环境,但如果你必须这样做,那你就做错了!如果两个 if 子句都没有被命中,那么会发生什么情况,那么变量不会被创建(python 是一种解释语言),因此你需要重写这个函数,让它返回这个值,初始化为 None ...跨度>

标签: python function variables configparser


【解决方案1】:

您只需退回它们。当函数结束时,它们不再存在。

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

在任何一种情况下,您都需要在调用函数时检查返回值。值是否为无。

【讨论】:

  • 我试过了,当我尝试 read_config_file.php_bsc_mdls 时得到错误 AttributeError: 'function' object has no attribute 'php_bsc_mdls'
  • 您需要检查它们是否已创建。将相应地修改代码。
  • 是的,我们可以通过类来实现,但尝试使用 python 函数来实现
  • 我在这里假设你要么只有基本的,要么两者都有。但你可以修改它。因为如果不满足条件 config.has_option,则不会创建该变量。您还可以在 if 子句之外创建变量
  • 空?!我认为您的意思是无,无论如何只需将两个变量初始化为无并在最后返回它们......
【解决方案2】:
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.

【讨论】:

    【解决方案3】:

    正如人们所说,这样做是合理的。

    但是……

    在 python 中,函数是对象,所以你可以这样做:

    def a():
        a.x = 10
    
    a()
    print a.x    # >> 10
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 2012-01-22
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多