对象实例

时间:2016-11-26 19:26:38

标签: python object dictionary immutability cartopy

如果我运行以下cartopy代码:

import cartopy.crs as ccrs
globe = ccrs.LambertCylindrical()
print(globe.proj4_params)
globe.proj4_params['a'] = 5
print(globe.proj4_params)

我明白了:

{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}
{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}

强制proj4_params属性是不可变的。

但它只是一个沼泽标准dict

print(type(globe.proj4_params))

<class 'dict'>

由于它在C中实现,因此不能覆盖这种行为(至少不安全)。

好的,但是这个类的代码是dead simple,所以我的理解有些不对劲。有人可以向我解释为什么我会这样做吗?

修改

以下内容:

projection.proj4_params = dict(projection.proj4_params)

结果:

*** AttributeError: attribute 'proj4_params' of 'cartopy._crs.CRS' objects is not writable

2 个答案:

答案 0 :(得分:1)

您可以通过首先将其转换为字典来确保您的参数是字典。

params = dict(globe.proj4_params)

然后,如果你打印

print type(params)

<type 'dict'>

请注意问题中的<type 'dict'>而不是<class 'dict'>。您正在使用的字典可能是一个不可变的自定义类,但使用相同的dict名称。

答案 1 :(得分:1)

proj4_params对象最终在Projection的超类CRS中定义,该超级类由私有的cython模块_crs.pyx提供。当一个手写CRS&#39; proj4_params是定义的,它只是被定义为类中的变量而不是类变量(也就是说, isn&lt; t 定义为self.proj4_params)。这是你无法修改proj4 params值的公平部分原因。

对于它的价值,我相信这是纸板CRS的正确方法。表现。每个CRS的proj4_params元素直接引用了cartopy在Python中提供的基础投影的规范定义。这些规范定义由proj.4组织维护(例如,Lambert Cylindrical is here),因此修改proj4_params意味着您的投影不再是Lambert圆柱投影。 / p>

如果您特别需要一个几乎 Lambert圆柱形的折叠式CRS,您可以通过复制纸板自己LambertCylindrical中的代码来创建自己的crs类。只要您在自己的班级中保留继承权,您就应该能够像使用cartopy的内置CRS那样使用它。请注意,如果您为自己的类修改proj4_params,它可能无效,因为您指定的参数与proj.4本身的任何内容都不匹配。在这种情况下,您可以考虑修改您的CRS&#39; globe属性可以根据需要进行投影更改。