Python集中式字典访问
我希望创建一个包含静态查找字典列表的文件。该文件将被项目中的所有其他文件访问,因此本质上我试图避免数据冗余,并进行集中控制 为了完成它,我创建了一个类,创建了查找字典,并添加了getter方法来访问。但是当我尝试使用dict时,我的get方法似乎无法与全局声明的dict兼容 下面是我的代码的样子:Python集中式字典访问,python,python-3.x,Python,Python 3.x,我希望创建一个包含静态查找字典列表的文件。该文件将被项目中的所有其他文件访问,因此本质上我试图避免数据冗余,并进行集中控制 为了完成它,我创建了一个类,创建了查找字典,并添加了getter方法来访问。但是当我尝试使用dict时,我的get方法似乎无法与全局声明的dict兼容 下面是我的代码的样子: class global_lookup: PROVINCE_DICT = { "AB" : "Alberta", "BC" : "British Colum
class global_lookup:
PROVINCE_DICT = {
"AB" : "Alberta",
"BC" : "British Columbia",
"MB" : "Manitoba",
"NB" : "New Brunswick",
"NL" : "Newfoundland and Labrador",
"NT" : "Northwest Territories",
"NS" : "Nova Scotia",
"NU" : "Nunavut",
"ON" : "Ontario",
"PE" : "Prince Edward Island",
"QC" : "Quebec",
"SK" : "Saskatchewan",
"YT" : "Yukon"
}
def get_province_short(province_long):
for prov_shrt, prov_long in PROVINCE_DICT.items():
if province_long == prov_long:
return prov_shrt
else:
raise DatahubError(F"get_province_short - Province data for {province_long} could not be located")
def get_province_long(province_short):
if province_short in PROVINCE_DICT.keys():
return PROVINCE_DICT[province_short]
else:
raise DatahubError(F"get_province_long - Province data for {province_short} could not be located")
因为这将是一个静态dict,所以我打算包含这个类并调用方法来访问长省和短省名称
例如,我使用以下命令从另一个类调用此命令:
global\u lookup.get\u province\u long('ON')
我得到的错误是:
“名称”省未定义
我希望“安大略省”
会被返回
我做错了什么?此字典将是类的每个实例的属性。按照惯例,该实例在方法内部被称为
self
。它作为第一个参数自动传递给每个方法。这为您提供了一种引用实例的方法:它被称为self
。然后你可以得到它拥有的东西
试试这个:
class GlobalLookup: # More conventional class name in Python
PROVINCE_DICT = {
"AB" : "Alberta",
"BC" : "British Columbia",
"MB" : "Manitoba",
"NB" : "New Brunswick",
"NL" : "Newfoundland and Labrador",
"NT" : "Northwest Territories",
"NS" : "Nova Scotia",
"NU" : "Nunavut",
"ON" : "Ontario",
"PE" : "Prince Edward Island",
"QC" : "Quebec",
"SK" : "Saskatchewan",
"YT" : "Yukon"
}
def get_province_short(self, province_long):
for prov_shrt, prov_long in self.PROVINCE_DICT.items():
if province_long == prov_long:
return prov_shrt
else:
raise DatahubError(f"get_province_short - Province data for {province_long} could not be located")
def get_province_long(self, province_short):
prov_long = self.PROVINCE_DICT.get(province_short)
if prov_long is None:
raise DatahubError(f"get_province_long - Province data for {province_short} could not be located")
return prov_long
我还在字典上使用了get
方法,因为它就在那里
请注意,
get\u province\u short()
中的else
应该位于for
的上,因为只有当for
循环正常完成时,您才想引发错误。省目录
是全局查找
的类属性。它不会自动添加到方法的命名空间中。由于您打算直接从类中调用这些方法,并且需要访问类属性,因此应该将这些方法声明为类方法。例如:
@classmethod
def get_province_short(cls, province_long):
for prov_shrt, prov_long in cls.PROVINCE_DICT.items():
if province_long == prov_long:
return prov_shrt
else:
raise DatahubError(F"get_province_short - Province data for {province_long} could not be located")
注意@classmethod
装饰符,它将导致向方法签名中添加对类的引用。我们使用该引用(cls
)访问PROVINCE\u DICT
PROVINCE\u DICT
是一个实例变量,因此我们可以通过类名直接访问实例变量,如类方法中的class\u name.variable\u name
class global_lookup:
PROVINCE_DICT = {
"AB" : "Alberta",
"BC" : "British Columbia",
"MB" : "Manitoba",
"NB" : "New Brunswick",
"NL" : "Newfoundland and Labrador",
"NT" : "Northwest Territories",
"NS" : "Nova Scotia",
"NU" : "Nunavut",
"ON" : "Ontario",
"PE" : "Prince Edward Island",
"QC" : "Quebec",
"SK" : "Saskatchewan",
"YT" : "Yukon"
}
def get_province_short(province_long):
for prov_shrt, prov_long in global_lookup.PROVINCE_DICT.items(): #updated
if province_long == prov_long:
return prov_shrt
else:
raise DatahubError(F"get_province_short - Province data for {province_long} could not be located")
def get_province_long(province_short):
if province_short in global_lookup.PROVINCE_DICT.keys(): # update
return global_lookup.PROVINCE_DICT[province_short] #updated
else:
raise DatahubError(F"get_province_long - Province data for {province_short} could not be located")
方法调用:
print(全局查找。获取省长('ON'))
输出:
您能修复压痕吗?请确保您的压痕是正确的;目前不可能理解这里发生了什么。你有一个类,但里面是什么?所有这些函数实际上都是方法吗?如果是这样的话,他们为什么不采取self
?但是如果整个事情都是一门课,为什么你说这门课是全球性的呢?不是,是在教室里。我道歉。我试图纠正压痕。如果看起来可以理解,请告诉我。我刚刚加入了我认为问题所在的班级。PROVINCE\u DICT
现在已经不存在了。它也在类中吗?Python不是Java。这里您不需要类。您提出的要点非常有用-类名,使用Get而不是[],for循环的else。感谢你抽出时间来解释。但是,当我使用您推荐的代码时,我发现get\u province\u long()缺少1个必需的位置参数:“province\u short”
错误。必须添加@classmethod decorator来修复它。@SushantVasishta您是否使用参数调用了该方法?您需要输入省(简称),例如gl=GlobalLookup();总帐。获得利润('YT')
。哦,是的。我刚刚将@classmethod添加到您的代码中,它起了作用。@SushantVasishta好的,但您不需要这样做,因为您从不引用类,只引用实例。使用类名和方法名解决了我的问题。非常有用的@glibdud。我从来没有意识到装饰师是用来干什么的。我的第一个用例就在这里。感谢您的帮助。您可以通过类的实例访问类属性。这不需要是类方法。@kwinkunks当然可以,但询问者表示他计划直接从类中调用方法而不实例化。@glibdud好的,我完全错过了,谢谢。而且我也不明白。陛下