2016-11-26 8 views
0

Если я запускаю следующий код: 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'} 

Impying что proj4_params свойства неизменно.

Но это просто болото стандарт dict:

print(type(globe.proj4_params)) 

<class 'dict'> 

Который, так как она реализована в C, не могут быть перезаписаны, чтобы иметь такого рода поведение (по крайней мере, не безопасно).

Хорошо, но код этого класса dead simple, так что с моим пониманием что-то не так. Может кто-нибудь объяснить мне, почему я получаю такое поведение?

Edit:

Следующие:

projection.proj4_params = dict(projection.proj4_params) 

Результатов в:

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

Я подозреваю, что 'globe.proj4_params' является свойством, которое дает вам новую копию dict каждый раз, когда вы обращаетесь к ней, чтобы это не мешало вам. – RemcoGerlich

+0

Обратите внимание, что класс не является простым: LambertCylindrical не устанавливает свойство proj4_params, его init вызывает init в своем суперклассе (_RectangularProject), который вызывает init в своем суперклассе (Projection), который не имеет init, но он имеет метаклассы. На самом деле я понятия не имею, откуда происходит свойство proj4_params. – RemcoGerlich

+0

Что произойдет, если вы выполните 'params = globe.proj4_params; params ['a'] = 5; печать (PARAMS) '? – RemcoGerlich

ответ

1

Вы можете убедиться, что ваш PARAMS является словарем, преобразовав его в один первый.

params = dict(globe.proj4_params) 

Затем, если вы печатаете

print type(params) 

<type 'dict'> 

Обратите внимание на <type 'dict'> вместо <class 'dict'> в вашем вопросе. Используемый вами dict может быть настраиваемым классом, который является неизменным, но использует то же имя dict.

+0

Мне нужно изменить исходный параметр на месте, но не создать его копию. Это даже намек на проблему, но я отредактировал вопрос. –

+0

Основываясь на обновлениях к вашему вопросу, похоже, что это невозможно. Зачем вам нужно редактировать значения? – Soviut

+0

Если это невозможно, я все равно хочу знать * почему * это невозможно. Я получаю, что вы можете установить права на запись в классах C, но не заставит 'type' сообщать о каком-либо другом типе объекта, например. ''? –

1

proj4_params объект, наконец, определен в суперкласса Projection «ы CRS, который поставляется частным, модуль Cython _crs.pyx в пределах cartopy. Когда задан картографический CRS-proj4_params, он просто определяется как переменная внутри класса, а не как переменная класса (то есть не, определяемая как self.proj4_params). Это справедливая часть причины, по которой вы не можете изменять значения параметров proj4.

Для чего это стоит, я считаю, что это правильный способ для картографического CRS «вести себя». Элемент proj4_params каждого CRS является прямой ссылкой на каноническое определение базовой проекции, которую Cartopy предоставляет внутри Python. Эти канонические определения поддерживаются организацией proj.4 (например, Lambert Cylindrical is here), поэтому изменение proj4_params означает, что ваша проекция больше не является цилиндрической проекцией Ламберта.

Если вы особенно нуждаетесь в cartopy CRS, что это почти Ламберт Круглое, вы всегда можете создать свой собственный CRS путем дублирования кода в собственном классе LambertCylindrical cartopy в. До тех пор, пока вы сохраняете наследование в своем классе, вы сможете использовать его, как и встроенный CRS.Обратите внимание, что если вы внесете изменения в proj4_params для своего собственного класса, это может не сработать, потому что ваши указанные параметры не соответствуют ничему в самом proj.4. В этом случае вы можете изучить модификацию своего атрибута CRS 'globe, чтобы внести необходимые изменения в проекции.

 Смежные вопросы

  • Нет связанных вопросов^_^