0

我正在用 sqlite3 尝试一些 python 测试脚本。

这是我写的脚本

#!/usr/bin/env python

from sqlite3 import dbapi2 as sqlite
from sys import argv,exit

db_name = "filenames.db"

def define_db():
    try:
        conn = sqlite.connect(db_name)
    except IOError as e:
        print "problem while creating/connecting the db:",e.args[0]
        exit(1)

    return conn

def write_db(conn,cursor,fni):
    conn.execute("CREATE TABLE IF NOT EXISTS file (filenames TEXT UNIQUE)")
    query = "INSERT OR REPLACE INTO file VALUES($filenames)"

    cursor.execute(query,[fni])
    cursor.close()  
    conn.commit()
    conn.close()
    print fni,"should now be in the db" 
    exit(0)

if __name__ == "__main__":
    if len(argv) == 2:
        etag = argv[1]
    else:
        print "no argument given - stopping now"
        exit(1)

    conn = define_db()
    cursor = conn.cursor()
    write_db(conn,cursor,fni)

我不断收到此错误,但无法解决。

Traceback (most recent call last):
  File "blah.py", line 37, in <module>
    write_db(conn,cursor,fni)
NameError: name 'fni' is not defined

任何想法是什么问题。

此时我使用python 2.7.3

4

3 回答 3

2

脚本的最后一行引用了一个fni未定义的名称。

于 2012-07-24T20:13:19.990 回答
0

您尚未定义变量“fni”,但您正在使用它。

于 2012-07-24T20:18:56.953 回答
0

像这样的静态分析工具pyflakespylint可用于捕获此类愚蠢的错误

如果你在一个函数中编写了大部分代码(所以它不假设blub是一个全局变量,这不会让 pyflakes/pylint 抱怨):

def main():
    if len(argv) == 2:
        blub = argv[1]
    else:
        print "no argument given - stopping now"
        exit(1)

    conn = define_db()
    cursor = conn.cursor()
    write_db(conn,cursor,fni)

if __name__ == "__main__":
    main()

...然后你会得到一对错误,它准确地指出了错误是什么(你将参数存储在 中blub,但尝试使用 访问它fni):

$ pip install pyflakes
$ pyflakes example.py
example.py:30: local variable 'blub' is assigned to but never used
example.py:37: undefined name 'fni'
于 2012-07-24T21:10:14.133 回答