Python集中式字典访问

Python集中式字典访问,python,python-3.x,Python,Python 3.x,我希望创建一个包含静态查找字典列表的文件。该文件将被项目中的所有其他文件访问,因此本质上我试图避免数据冗余,并进行集中控制 为了完成它,我创建了一个类,创建了查找字典,并添加了getter方法来访问。但是当我尝试使用dict时,我的get方法似乎无法与全局声明的dict兼容 下面是我的代码的样子: class global_lookup: PROVINCE_DICT = { "AB" : "Alberta", "BC" : "British Colum

我希望创建一个包含静态查找字典列表的文件。该文件将被项目中的所有其他文件访问,因此本质上我试图避免数据冗余,并进行集中控制

为了完成它,我创建了一个类,创建了查找字典,并添加了getter方法来访问。但是当我尝试使用dict时,我的get方法似乎无法与全局声明的dict兼容

下面是我的代码的样子:

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好的,我完全错过了,谢谢。而且我也不明白。陛下