Здесь "OK" означает, конечно, AYOR (на ваш страх и риск), но в остальном никаких предсказуемых проблем не возникает, если избегать очевидных конфликтов с именами существующих атрибутов.
Объекты Skyfield, особенно планеты, обычно имеют ограниченное количество атрибутов. Я часто пишу короткие сценарии для извлечения числовых данных, которые я сохраняю в виде текста и использую позже. По сути, это «одноразовые» сценарии, поскольку я редко использую их более одного или двух раз и никогда не делюсь ими.
Когда я пишу более надежный код, я обязательно создаю свои собственные объекты-контейнеры.
Мой вопрос: кажется, что у меня все работает хорошо, поэтому в этом конкретном контексте есть ли что-то, что может пойти не так, помимо конфликта имен атрибутов эм>?
from skyfield.api import load
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
eph = load('de421.bsp')
earth = eph['earth']
sun = eph['sun']
ts = load.timescale()
t = ts.utc(2016, 1, np.linspace(0, 366, 1000))
# SLOPPY WAY: just add them directly
earth.pos = earth.at(t).position.km
sun.pos = sun.at(t).position.km
earth.r = np.sqrt(((earth.pos-sun.pos)**2).sum(axis=0))
earth.peri = earth.r.min()
earth.apo = earth.r.max()
print earth.peri, earth.apo, earth.pos.shape
# BETTER WAY: tedious but more cautious
uhoh = dict()
ep = earth.at(t).position.km
sp = sun.at(t).position.km
r = np.sqrt(((ep-sp)**2).sum(axis=0))
uhoh['pos'] = ep
uhoh['r'] = r
uhoh['peri'] = r.min()
uhoh['apo'] = r.max()
earth.uhoh = uhoh
print earth.uhoh['peri'], earth.uhoh['apo'], earth.uhoh['pos'].shape
возвращает:
147100175.99 152103762.948 (3, 1000)
147100175.99 152103762.948 (3, 1000)
obj.__dict__[attr] = val
, если только объект не использует слоты или не переопределил__setattr__
. - person Iguananaut   schedule 06.05.2016