Linux而非Windows上的KeyError

时间:2018-08-03 10:43:03

标签: python python-3.x windows-10 ubuntu-16.04 keyerror

我有一个奇怪的情况:

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 个答案:

答案 0 :(得分:0)

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

  

@Basic感谢Basic问题确实是版本不匹配。视觉效果   Windows上的Studio默认为3.6,Ubuntu强制3.5.2   知道只是一个很小的修订就有如此巨大的重大变化   来自python。好像一团糟。

但经过进一步调查。它显示版本python 3.5.2与3.6.6相比具有读取json文件的怪异方式 从本质上讲,我加载数据的方式意味着它自己引用了加载后的属性。例如:

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

我的代码在从不加载东西时在stuff2中寻找东西

Python版本3.5.2没有将json数据加载到字典的特定顺序,这会导致问题。

Python 3.6.6修复了此问题。

答案 1 :(得分:0)

您不应该在try-catch块之外通过old_data_nameself.data获取值,因为如果没有这样的键,您将打印错误,而不是尝试通过该键获取某些内容。这是不对的。您应该这样写:

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))