代码之家  ›  专栏  ›  技术社区  ›  John

Linux而不是Windows上的KeyError

  •  2
  • John  · 技术社区  · 6 年前

    我有一个奇怪的情况:

    class SomeClass(object):
        def __init__(self, data):
            self.data = {}
            self.data = data
            old_data_name = "SOURCE" # self.data[old_data_name] = a list of values
            try:
               self.data[old_data_name] = [1,2,3,4]
            except Exception as e:
               print(str(e))
            new_data_name = "NEW" # a name
            self.data[new_data_name] = numpy.mean(self.data[old_data_name])
    

    所以这段代码在windows上运行得很好-我已经逐个调试并验证了它。 当我将代码部署到linux服务器上时。它给了我一个 KeyError: old_data_name

    我确信数据已经到了不应该发生关键错误的程度。 为什么python在Linux和Windows上的行为如此不同?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Lev Zakharov Riss    6 年前

    你不应该通过 old_data_name self.data 在try-catch块之外,因为如果没有这样的键,则会打印错误,并试图通过该键获取某些内容。这是错误的。你应该这样写:

    class SomeClass(object):
        def __init__(self, data):
            self.data = {}
            self.data = data
            old_data_name = "SOURCE" # self.data[old_data_name] = a list of values
            try:
                self.data[old_data_name] = [1,2,3,4]
                new_data_name = "NEW" # a name
                self.data[new_data_name] = numpy.mean(self.data[old_data_name])
            except Exception as e:
                print(str(e))
    
        2
  •  0
  •   John    6 年前

    我的第一印象是版本不匹配:

    @基本感谢基本的问题确实是版本不匹配。视觉的 windows上的Studio默认为3.6,Ubuntu强制3.5.2din不 我知道在一次小小的修改中有如此巨大的突破性变化 来自python。好像一团糟。

    但经过进一步调查。它揭示了与3.6.6版本相比,Python3.5.2版本具有奇怪的读取json文件的方式 基本上,我加载数据的方式意味着它自引用了加载后的属性。例如:

    {properties: {"stuff": "do this", "stuff2": "do another with @stuff" }}
    

    我的代码在stuff2中查找内容,但内容从未加载

    Python version 3.5.2没有将json数据加载到dict的特定顺序 会引起问题。

    Python 3.6.6解决了这个问题。