在赋值之前引用的python UnboundLocalError

时间:2018-05-21 15:01:11

标签: python python-3.x dictionary

我发现这似乎是一个常见的错误,但我没有看到我的答案。

  

UnboundLocalError:分配前引用的局部变量“tfstate_dict

#!/usr/bin/env python
import json


def main():
    get_sfleet_id()

def get_sfleet_id():
    try:
        f=open("terraform_remote.tfstate", "r")
        contents =f.read()
        tfstate_dict = json.load(contents)

    except:
        print("error loading %s" % f)
    print(contents)
    print(tfstate_dict)

if __name__ == '__main__': main()

1 个答案:

答案 0 :(得分:2)

正如我在评论中所写,tfstate_dict在您退出try区块之前不会存在。但这并不是说它适用于所有前面的代码;它只适用于tfstate_dict,因为它恰好是最后一行。

使用以下内容可以轻松测试:

try:
    a = int(2)
    b = int(3)
    c = int('hi')
except:
    print(locals())
    print()
    print(locals().get('a'))

您应该看到'a''b'都已定义且可以访问(取决于您运行此代码的方式,locals()中可能还有很多内容) 。因此,'a''b'的存在不能保证'c'存在。

您当前的异常处理存在两个问题:

  1. 您的try区块可能会按照您目前的方式进行处理。如果无法找到该文件,此代码将失败,但您不一定知道发生了这种情况。如果您的代码最初只在tfstate_dict = json.load(contents)上失败,那么您现在正在为什么突然在NameError print(contents)突然发现except
  2. 您不希望通过一揽子except Exception as e:来解决这些问题。至少您需要使用e,这样您也可以打印import json from json.decoder import JSONDecodeError try: with open('something.json') as infile: try: #data = json.load(infile) # This is what you'd really use data = json.loads("{hi: 2}") # But let's make it fail except JSONDecodeError: print("Not valid JSON, try something else") data = infile.read() except FileNotFoundError: print("Can't find file") data = ''
  3. 这是一个假设情况,您处理的文件不存在,您还可以解析JSON。

    export class SecureComponent implements OnInit {
        public _isLoading: boolean;
        on(eventName, callback) {
        this.observable.filter((event) => {
          this._isLoading = event.isLoading; //set "_isLoading" but It isn't change value in template.
          console.log(this._isLoading);
          return event.name === eventName;
        }).subscribe(callback);
    }
    
    ChangeIsLoading(isLoading){
        this._isLoading = !isLoading; // I try to change value in function. it work very well
      }
    }