复制静态变量(文件范围)行为

时间:2015-12-24 12:56:25

标签: python python-2.7 static-variables

静态,我的意思是,对象(变量)不会改变。假设我有一个名为my_static_vars的python模块,它包含a,其起始值为10(整数)。

我在该模块中有一个功能:

def prntandinc(): #print and increase
     print a
     a += 1

当我从另一个程序导入模块时,我希望它输出11。但如果没有任何特殊限制,我也不会问这个问题。

我无法将其保存在文件中,不仅访问速度要慢很多,而且我需要静态的数据大小非常大,而且每次都必须加载它。

我想让我的模块在一个永久循环中运行(好吧,直到它被告知)并听取进程间通信(意味着我不会导入它,只是让它接收来自&#39的请求) ;导入'编程并发送必要的响应)。现在,在我的情况下,这可能就足够了 - 因为该模块所做的就是生成一个随机序列号,并确保它不会出现在used_serials(这应该是静态的,这是可能的)列表中(我不想使用文件的原因是因为我在相当短的时间内生成了大量的序列号 - 但我想知道是否有一个不那么复杂的解决方案。

是否有任何不太复杂的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

听起来像数据库会做。只需import sqlite3

创建表格(将其保存在当前目录中serials.db):

import sqlite3
conn = sqlite3.connect('serials.db') #Will create a new table as it doesn't exist right now
cur = conn.cursor() #We will use this to execute commands
cur.execute('''CREATE TABLE serials_tb (serial text)''') #for more than one column add a comma, as in a tuple, and write '[COL_NAME] [COL_TYPE]' without the apostrophes. You might want (as I suppose you only want a serial to be used once) to define it as a primary key
conn.commit()
conn.close()

添加序列号:

import sqlite3
conn = sqlite3.connect('serials.db') #Will connect to the existing database
cur = conn.cursor() 
data = ('MY_SERIAL',) #a tuple
cur.execute('''INSERT INTO serials_tb VALUES (?)''', data)
conn.commit()
conn.close()

选择一个序列(看看它是否已存在):

import sqlite3
conn = sqlite3.connect('serials.db') #Will connect to the existing database
cur = conn.cursor()
data = ('MY_SERIAL',)
qry = cur.execute('''SELECT * FROM serials_tb WHERE serial=?''', data)
#You can iterate over it and get a tuple of each row ('for row in qry:')
#But to check if a col exists, in your case, you can do so:
if len(qry.fetchall()) != 0:
    #The serial is used
else:
    #The serial isn't used

注意:显然,您不需要每次都导入sqlite3(仅在每个文件中,但不是每次执行命令时,也不需要每次执行时都连接或关闭连接)在需要时提交更改,在开始时连接并在结束时关闭连接。 有关详细信息,请参阅here