У меня есть код, как показано ниже. Мое требование - заполнить BagA
и BagB
один раз и только один раз. Итак, у меня нет класса, но я написал код в модуле. У меня есть __BagA
и __BagB
с подчеркиванием, потому что я не хочу, чтобы это изменилось снаружи. У меня есть получатель, как показано, используя @property
декоратор. Но это не работает.
module.py:
import csv
import sys
import threading
__BagA = list()
__BagB = dict()
__lock = threading.Lock()
@property
def BagA():
if not __BagA:
raise("Call Initialize() first")
else:
return __BagA
@property
def BagB():
if not __BagB:
raise("Call lookup.Initialize() first")
else:
return __BagB
def __get__BagA(directory):
#logic to populate BagA
BagA=some list
def __get__BagB(directory):
#logic to populate BagB
BagB=dict after processing the logic
def initialize(directory):
__lock.acquire()
__get__BagA(directory)
__get__BagB(directory)
__lock.release()
Основной сценарий:
import module
module.initialize("dir")#this works. I see all bags getting populated
#Below does not work
module.BagA #This gives an object with some fget and fset and not the value of BagA
#below works
module.__BagA
Еще одна проблема заключается в том, что вместо __BagA
, который все еще может быть измененным извне, я мог бы написать BagA
и иметь декоратор @Bag.setter
и декоратор @BagA.deleter
, который возвращает исключение, говорящее «вы не можете изменить это».
Они также не работают, и я не хочу писать их отдельно, но в одной строке, как показано ниже, потому что они ведут себя одинаково. Не работает ни отдельная, ни одна строка:
@BagA.setter,@BagA.deleter
def BagA(value):
print('cannot set or delete') #Is this possible?