如何独立地在 python 中的多个模块中使用和更新同一个变量?

How to use and update same variable across multiple modules in python independently?

我有 3 个文件,我想执行如下操作

[1] conf.py

var = 10  # Intialized with 10 (start)

[2] file_1.py

import conf
print(conf.var)   # Prints 10
conf.var = 1000   # Updated to 1000

[3] file_2.py

import conf
print(conf.var)   # Prints 1000
conf.var = 9999   # Updated to 9999

我想要这样的东西。假设文件 file_1 和 file_2 will be running and will stay in memory unless pressed CTRL+C。如何更改其他 2 个文件中的 var 并保留它的值?如果我们像其他 2 个文件一样在 file_3 中使用它,var 的最终值应该是 9999。 [它应该打印 9999] 等等。

执行顺序file_1.py -> file_2.py.

帮我确定一些方法或一些 module/package 可以处理这个问题。

谢谢! :)

你不能使用 class 并且从不初始化对象吗?

class Conf:
    var = 10

然后您将更新 Conf 为:

from conf import Conf

...

Conf.var = ...

永远不要使用 Conf()...,因为这会创建一个对象实例。

考虑这种方法:

class Lookup:
    # For allowing storing and looking up variables using variable sets of key pairs.
    # Each key pair is a key-value pair tuple.
    # The entire set of key pair tuples uniquely stores and retreives a variable value.
    # frozenset is used to achieve the benifit of a set while ensuring immutability, so it can be hashed for use as a dictionary key.
    lookupDictionary = {}
    def put(*, keyPairs, value):
        Lookup.lookupDictionary[frozenset(keyPairs)] = value
    def get(*, keyPairs, default, matchWildcard = False): # No substring searching. only '*' can be used for searching for an entire string
        if matchWildcard and True in [bool(x) for x in [(y[1] == '*') for y in keyPairs]]:
            # If we are here, we need to match using wildcard. 
            valuedKeyPairs = set([y for y in keyPairs if not y[1] == '*'])  # Separating value pairs from wildcard pairs
            starKeyPairs = set(keyPairs) - valuedKeyPairs
            starKeyPairNames = [x[0] for x in starKeyPairs]
            return [Lookup.lookupDictionary[i] for i in Lookup.lookupDictionary.keys() if set(valuedKeyPairs).issubset(i) and sorted(starKeyPairNames) == sorted([x[0] for x in i-valuedKeyPairs])]
        return Lookup.lookupDictionary.get(frozenset(keyPairs), default)
    def getAllValues(*, keyPairs):
        # Returrns all qualifying values to part or all of the key pairs
        return [Lookup.lookupDictionary[i] for i in set(Lookup.lookupDictionary.keys()) if set(keyPairs).issubset(i)]
class utils:
    def setCacheEntry(*, zipFileName, functionName, value):
        Lookup.put(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],value=value)

    def getCacheEntry(*, zipFileName, functionName, default):
        return Lookup.get(keyPairs = [('__zipFileName__',zipFileName),('__functionName__',functionName)],default=default)
from Lookup import utils
from Lookup import Lookup
utils.setCacheEntry(zipFileName='FileName.zip',functionName='some_func',value='some_value')
utils.getCacheEntry(zipFileName='FileName.zip',functionName='some_func', default=1)

输出: 'some_value'

这是一个更简单的案例:

from Lookup import Lookup

def setParamValue(*, paramName, value):
    Lookup.put(keyPairs = [('__paramName__',paramName),],value=value)
    
def getParamValue(*, paramName, default):
    return Lookup.get(keyPairs = [('__paramName__',paramName),],default=default, matchWildcard=True)
    
setParamValue(paramName='name', value='John')
setParamValue(paramName='age', value=23)
getParamValue(paramName='name', default='Unknown')

输出:约翰

getParamValue(paramName='age', default=-1)

输出:23

getParamValue(paramName='*', default='Unknown')

输出:['John', 23]

如果需要在不同的程序之间进行通信variables/objects, 以上不起作用。 为此,您可以使用 pickle 在 OS 中转储和加载对象: 我没有测试过它是否会深度或浅度倾倒对象,但可能是后者。

import pickle

# Dumping

with open('object_pickle','wb') as f:
    pickle.dump('some_value', f)    

# Loading
    
with open('object_pickle','rb') as f2:
    var = pickle.load(f2)

print(var)

输出:'some_value'

我解决了这个问题。我会建议使用像 Redismemcached 这样的共享内存缓存提供程序。两者都启动了一个我们需要连接的服务器实例,并像 key-value 商店一样使用它。请注意,值应为 strbytes.

类型

内存缓存

安装memcached
sudo apt install memcached
使用默认设置启动服务器

使用前需要先启动服务器或者在linux

中设置为服务
sudo service memcached start
安装python memcached 客户端
pip install pymemcache
示例代码
from pymemcache.client import base

client = base.Client(('localhost', 11211))
client.set('some_key', 'stored value')

client.get('some_key')  # Returns "stored value"

Redis

redis 的过程完全相同

安装redis
sudo apt install redis
使用默认设置启动服务器

使用前需要先启动服务器或者在linux

中设置为服务
sudo service redis start
安装pythonredis客户端
pip install redis
示例代码
import redis

client = redis.Redis()  # Default settings/credentials
client.set('some_key', 'stored value')

client.get('some_key')  # Returns "stored value"

用法

  • Redis 提供了更多的安全性和容错性。
  • 两者都有一些内存限制,但都是可配置的。如果您的数据更大,请使用适合您问题的文件或数据库。
  • 两者都易于配置