为什么未来的代码会导致Python中的NameError

时间:2018-03-14 21:05:50

标签: python nameerror

我在Windows上有一个Python 3.6.4程序,它使用配置文件config.py来定义全局变量,以及执行其他操作的main.py脚本。我的config.py包含一个名为“variable”的字符串,其值为“value”:

# config.py
global variable
variable = "value"

如果我导入main.py中的所有变量并尝试打印(变量),它可以正常工作。但是,如果我尝试:变量AFTERWARDS,那么它在第一次打印(变量)时失败。对于长代码,很抱歉,我尝试用较小的代码片段重现问题并且工作正常,这让我很困惑:

# main.py
import argparse, logging, sys
from config import *

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-v',
                    '--verbose',
                    action='store_true',
                    help="Rapporter davantage d'information.")
    parser.add_argument('-l',
                    '--journal',
                    action='store',
                    default=None,
                    help="Spécifier le nom du journal.")
    parser.add_argument('--csv',
                    action="store_true",
                    help="Exporter les résultats vers un fichier de sortie CSV.")
    args = parser.parse_args()

    # Configuration du journal
    log_frmt = "%(asctime)s[%(levelname)s] %(message)s"
    date_frmt = "%Y-%m-%d %H:%M:%S "
    if args.verbose:
        log_lvl = logging.DEBUG
    else:
        log_lvl = logging.INFO

    logging.basicConfig(filename=args.journal,
                    format=log_frmt,
                    datefmt=date_frmt,
                    level=log_lvl)

    logging.info(f"Journal initié : {args.journal}")

    if args.csv:
        print(variable)
        sys.exit()

        #try:
            #print(variable)
            #variable
            #logging.debug(f"variable = {variable}")
            #sys.exit()
        #except NameError:
            #variable = None
            #logging.warning("variable non-défini, initialisé à None")
            #sys.exit()

if __name__ == '__main__':
    main()

输出结果为:

$ python main.py --csv
2018-03-14 16:44:20 [INFO] Journal initié : None
value

......这是你所期望的。但是如果我取消注释最后一部分,那么在sys.exit()之后:

    ...
    logging.info(f"Journal initié : {args.journal}")

    if args.csv:
        print(variable)
        sys.exit()

        try:
            print(variable)
            variable
            logging.debug(f"variable = {variable}")
            sys.exit()
        except NameError:
            variable = None
            logging.warning("variable non-défini, initialisé à None")
            sys.exit()

if __name__ == '__main__':
main()

...它在第一次打印(变量)时失败:

$ python main.py --csv
2018-03-14 16:55:58 [INFO] Journal initié : None
Traceback (most recent call last):
  File "main.py", line 52, in <module>
    main()
  File "main.py", line 38, in main
    print(variable)
UnboundLocalError: local variable 'variable' referenced before assignment

可能导致这种情况的原因是什么?没有其他改变,我保存我的脚本,重新加载python(我从git bash运行它,而不是从没有重新加载模块的python控制台)...我还能尝试什么?

我尝试使用更简单的脚本重现这一点,没有记录和没有argparse,但可以重现它。

谢谢。

0 个答案:

没有答案