From a20c13490c95845d2ede6f8e3f18f1439aa0f155 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Thu, 4 Jun 2026 04:35:44 +0800 Subject: [PATCH] =?UTF-8?q?v6.0.13:=20=E6=96=B0=E5=A2=9E=20Tajika=20Yogas?= =?UTF-8?q?=20+=20Sahams=20=E6=8A=80=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/tajika.py: 新增 calc_tajika_yogas, calc_all_sahams 等6个函数 - scripts/jyotish_engine.py: cmd_full_reading 新增 Step 4.8 调用新函数 - references/technique_registry.json: 新增 tajika_yogas, sahams 技法注册(partial) - references/strict-workflow-router.md: Audit Table 模板新增两行 - CHANGELOG.md: 新增 v6.0.13 条目 - SKILL.md: 版本号 6.0.12 → 6.0.13 --- CHANGELOG.md | 25 +- SKILL.md | 2 +- references/strict-workflow-router.md | 2 + references/technique_registry.json | 50 +++- scripts/jyotish_engine.py | 19 ++ scripts/tajika.py | 405 +++++++++++++++++++++++++++ 6 files changed, 498 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 891bacb4..f877b429 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,29 @@ # 印度占星 Skill 更新日志 -## v6.0.12-dispositor-chain-inter-chart-linkage(2026-06-04)—— 新增 Dispositor Chain + Inter-chart Linkage 技法 +## v6.0.13-tajika-yogas-sahams(2026-06-04)—— 新增 Tajika Yogas + Sahams 技法 + +> **触发原因**:用户指出当前 skill 缺少 Tajika Yogas(Ithasala/Easarapha/Nakta/Yamaya/Manahoo/Graha Yuddha)和 Sahams(Punya/Karya/Vivah/Rajya/Shatru/Labha/Parakrama)两个重要技法体系。 + +### 新增功能 + +- `scripts/tajika.py` 新增 6 个函数: + - `calc_tajika_yogas(planet_lons, planet_lats, chart_type)`:计算所有 Tajika Yogas + - `calc_all_sahams(planet_lons, asc_lon, birth_dt, chart_type)`:计算所有主要 Sahams + - `_is_faster(p1, p2)`:判断行星速度快慢 + - `_ithasala_interp(fast, slow, diff)`:Ithasala 瑜伽解读 + - `_easarapha_interp(fast, slow, diff)`:Easarapha 瑜伽解读 + - `_saham_dict(lon, name, interp)`:构建 Saham 字典 +- `scripts/jyotish_engine.py` 的 `cmd_full_reading` 新增 Step 4.8:调用 `calc_tajika_yogas` 和 `calc_all_sahams`,输出 `modules.tajika_yogas` 和 `modules.sahams` +- `references/technique_registry.json` 新增 2 个技法注册:`tajika_yogas`、`sahams`,状态均为 `partial` +- `references/strict-workflow-router.md` 同步更新:Technique Audit Table 模板新增 `Tajika Yogas` 和 `Sahams` 两行 + +### 验证结果 + +- Python 语法检查通过 +- tajika.py 函数测试:`calc_tajika_yogas` 检测到 2 个格局(Nakta + Manahoo),`calc_all_sahams` 计算出 7 个 Saham 点 +- `full-reading` 集成测试:待运行(需要 pyswisseph 环境) + +----dispositor-chain-inter-chart-linkage(2026-06-04)—— 新增 Dispositor Chain + Inter-chart Linkage 技法 > **触发原因**:用户指出当前 skill 缺少"定位星链"和"分盘间飞星落宫"两个高级技法,导致事业/婚恋/财务等解盘无法完整分析行星能量流向和分盘间验证。 diff --git a/SKILL.md b/SKILL.md index 59203d56..c3242b31 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: jyotish-vedic-astrology -version: 6.0.12 +version: 6.0.13 description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。 --- diff --git a/references/strict-workflow-router.md b/references/strict-workflow-router.md index cc23b4b9..b8264755 100644 --- a/references/strict-workflow-router.md +++ b/references/strict-workflow-router.md @@ -173,6 +173,8 @@ Every Level 2+ output must include this table near the end. | Ashtakavarga | Used / not used | ... | ... | | Dispositor Chain | Used / not used | ... | ... | | Inter-chart Linkage | Used / not used | ... | ... | +| Tajika Yogas | Used / partial / not used | Ithasala/Easarapha/Nakta etc. | Cap annual timing confidence | +| Sahams | Used / partial / not used | Punya/Karya/Vivah etc. | Cap event timing confidence | | Argala | Used / not used | ... | ... | | KP / Sub-lord | Used / not required / unavailable | ... | ... | | Historical verification | Used / not provided | ... | ... | diff --git a/references/technique_registry.json b/references/technique_registry.json index 8507771a..90f1c810 100644 --- a/references/technique_registry.json +++ b/references/technique_registry.json @@ -398,6 +398,44 @@ ], "audit_label": "Inter-chart Linkage", "missing_impact": "Cross-chart planet linkage (D1->D9->D10) analysis incomplete." + }, + "tajika_yogas": { + "name": "Tajika Yogas / 年运盘格局", + "domains": [ + "tajika", + "timing", + "event", + "yoga" + ], + "status": "partial", + "knowledge_refs": [], + "commands": [ + "full-reading" + ], + "output_paths": [ + "modules.tajika_yogas" + ], + "audit_label": "Tajika Yogas", + "missing_impact": "Tajika year-chart yoga detection incomplete; annual timing confidence capped." + }, + "sahams": { + "name": "Sahams / 特殊点", + "domains": [ + "saham", + "timing", + "event", + "tajika" + ], + "status": "partial", + "knowledge_refs": [], + "commands": [ + "full-reading" + ], + "output_paths": [ + "modules.sahams" + ], + "audit_label": "Sahams", + "missing_impact": "Saham point calculation incomplete; annual/event timing layer missing." } }, "routes": { @@ -425,7 +463,9 @@ "vargottama", "pushkara", "dispositor_chain", - "inter_chart_linkage" + "inter_chart_linkage", + "tajika_yogas", + "sahams" ], "optional_techniques": [ "bhava_chalit", @@ -449,7 +489,9 @@ "shadbala", "ashtakavarga", "dispositor_chain", - "inter_chart_linkage" + "inter_chart_linkage", + "tajika_yogas", + "sahams" ], "optional_techniques": [ "d9_navamsa", @@ -479,7 +521,9 @@ "vargottama", "pushkara", "dispositor_chain", - "inter_chart_linkage" + "inter_chart_linkage", + "tajika_yogas", + "sahams" ], "optional_techniques": [ "bhava_chalit", diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index 101dc5f3..b2de7714 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -3454,6 +3454,25 @@ def cmd_full_reading(args): except Exception as e: report['errors'].append(f"dispositor-chain+inter-chart: {e}") + # ── Step 4.8: Tajika Yogas + Sahams (v6.0.13) ── + try: + from tajika import calc_tajika_yogas, calc_all_sahams + + # Tajika Yogas(用本命盘行星经度) + tc_yogas = calc_tajika_yogas(planet_lons) + report['modules']['tajika_yogas'] = tc_yogas + + # Sahams(特殊点)—— 需要出生时间 + birth_dt = getattr(args, 'birth_datetime', None) + if birth_dt and planet_lons: + sahams_result = calc_all_sahams(planet_lons, asc_deg, birth_dt) + report['modules']['sahams'] = sahams_result + else: + report['modules']['sahams'] = {'warning': 'birth_datetime or planet_lons missing, skip saham calc'} + + except Exception as e: + report['errors'].append(f"tajika-yogas+sahams: {e}") + # ── Step 5: 精确相位 ── try: from aspects import calc_all_aspects diff --git a/scripts/tajika.py b/scripts/tajika.py index d955100e..c9ddc87f 100644 --- a/scripts/tajika.py +++ b/scripts/tajika.py @@ -237,3 +237,408 @@ def _year_theme(lord): 'Saturn': '纪律、长寿、建筑、责任', } return themes.get(lord, '') + + +# ============================================================================ +# Tajika Yogas(年运盘特殊格局)—— v6.0.13 新增 +# ============================================================================ + +def calc_tajika_yogas(planet_lons: Dict[str, float], + planet_lats: Optional[Dict[str, float]] = None, + chart_type: str = 'varsha') -> Dict: + """ + 计算 Tajika Yogas(年运盘特殊格局)。 + + 参数: + planet_lons: 行星经度字典 {行星名: 经度(0-360)} + planet_lats: 行星纬度字典(可选,用于部分Yoga) + chart_type: 'varsha'(年运盘)或 'natal'(本命盘) + + 返回: + { + 'yogas': [...], # 检测到的Yogas列表 + 'ithasala': [...], # Ithasala连接瑜伽 + 'easarapha': [...], # Easarapha分离瑜伽 + 'nakta': None, # Nakta夜间瑜伽 + 'yamaya': [...], # Yamaya双重瑜伽 + 'manahoo': [...], # Manahoo特殊组合 + 'graha_yuddha': [...], # Graha Yuddha行星战争 + 'summary': str, # 总结 + } + """ + if planet_lats is None: + planet_lats = {} + + Planet_LIST = ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn', 'Rahu', 'Ketu'] + results = { + 'yogas': [], + 'ithasala': [], + 'easarapha': [], + 'nakta': None, + 'yamaya': [], + 'manahoo': [], + 'graha_yuddha': [], + 'summary': '', + } + + # ── 1. Ithasala Yoga(连接瑜伽)── + # 定义:两行星同星座,快行星追慢行星(apply),度数差<=3度 + for i, p1 in enumerate(Planet_LIST): + if p1 not in planet_lons: + continue + for p2 in Planet_LIST[i+1:]: + if p2 not in planet_lons: + continue + lon1, lon2 = planet_lons[p1], planet_lons[p2] + sign1 = int(lon1 / 30) % 12 + sign2 = int(lon2 / 30) % 12 + if sign1 != sign2: + continue # 不同星座 + + diff = (lon2 - lon1) % 360 + if diff > 180: + diff = 360 - diff + + # 判断谁快谁慢(简化:按行星自然速度) + speed_order = ['Moon', 'Mercury', 'Venus', 'Mars', 'Jupiter', 'Saturn', 'Sun'] + # Rahu/Ketu逆行,速度特殊 + fast = p1 if _is_faster(p1, p2) else p2 + slow = p2 if fast == p1 else p1 + + fast_lon = planet_lons[fast] + slow_lon = planet_lons[slow] + fast_diff = (fast_lon - slow_lon) % 360 + if fast_diff > 180: + fast_diff = 360 - fast_diff + + # Ithasala:快追慢,差<=3度 + if fast_diff <= 3.0: + yoga = { + 'type': 'Ithasala', + 'fast_planet': fast, + 'slow_planet': slow, + 'degree_diff': round(fast_diff, 4), + 'sign': SIGNS[sign1], + 'strength': 'strong' if fast_diff <= 1.0 else 'moderate', + 'interpretation': _ithasala_interp(fast, slow, fast_diff), + } + results['ithasala'].append(yoga) + results['yogas'].append(yoga) + + # ── 2. Easarapha Yoga(分离瑜伽)── + # 定义:两行星同星座,快行星已离开慢行星(separate),度数差<=3度 + for i, p1 in enumerate(Planet_LIST): + if p1 not in planet_lons: + continue + for p2 in Planet_LIST[i+1:]: + if p2 not in planet_lons: + continue + lon1, lon2 = planet_lons[p1], planet_lons[p2] + sign1 = int(lon1 / 30) % 12 + sign2 = int(lon2 / 30) % 12 + if sign1 != sign2: + continue + + fast = p1 if _is_faster(p1, p2) else p2 + slow = p2 if fast == p1 else p1 + + fast_lon = planet_lons[fast] + slow_lon = planet_lons[slow] + # 分离:快行星已过慢行星(在慢行星"后面") + # 即慢行星度数 > 快行星度数(在同一圈内) + slow_in_sign = slow_lon % 30 + fast_in_sign = fast_lon % 30 + if slow_in_sign > fast_in_sign: + # 慢在前面,快在后面 → 分离状态 + diff = slow_in_sign - fast_in_sign + if diff <= 3.0: + yoga = { + 'type': 'Easarapha', + 'fast_planet': fast, + 'slow_planet': slow, + 'degree_diff': round(diff, 4), + 'sign': SIGNS[sign1], + 'strength': 'strong' if diff <= 1.0 else 'moderate', + 'interpretation': _easarapha_interp(fast, slow, diff), + } + results['easarapha'].append(yoga) + results['yogas'].append(yoga) + + # ── 3. Nakta Yoga(夜间瑜伽)── + # 定义:太阳和月亮同星座(任何度数) + if 'Sun' in planet_lons and 'Moon' in planet_lons: + sun_sign = int(planet_lons['Sun'] / 30) % 12 + moon_sign = int(planet_lons['Moon'] / 30) % 12 + if sun_sign == moon_sign: + results['nakta'] = { + 'type': 'Nakta', + 'sun_sign': SIGNS[sun_sign], + 'moon_sign': SIGNS[moon_sign], + 'interpretation': '太阳月亮同星座,Nakta瑜伽——意志与情感合一,但可能过于自我中心', + } + results['yogas'].append(results['nakta']) + + # ── 4. Yamaya Yoga(双重瑜伽)── + # 定义:Ithasala的强化版,两行星度数差<=1度,且两行星都在强星座 + for item in results['ithasala']: + if item['degree_diff'] <= 1.0: + yamaya = { + 'type': 'Yamaya', + 'planet1': item['fast_planet'], + 'planet2': item['slow_planet'], + 'degree_diff': item['degree_diff'], + 'sign': item['sign'], + 'interpretation': f"Yamaya瑜伽——{item['fast_planet']}与{item['slow_planet']}极度接近({item['degree_diff']}度),双重能量融合", + } + results['yamaya'].append(yamaya) + results['yogas'].append(yamaya) + + # ── 5. Manahoo(特殊组合)── + # 定义:三行星同星座,且形成特殊组合 + sign_groups = {} + for p in Planet_LIST: + if p not in planet_lons: + continue + sign_idx = int(planet_lons[p] / 30) % 12 + if sign_idx not in sign_groups: + sign_groups[sign_idx] = [] + sign_groups[sign_idx].append(p) + + for sign_idx, planets in sign_groups.items(): + if len(planets) >= 3: + manahoo = { + 'type': 'Manahoo', + 'sign': SIGNS[sign_idx], + 'planets': planets, + 'planet_count': len(planets), + 'interpretation': f"Manahoo组合——{len(planets)}颗行星在{SIGNS[sign_idx]}({', '.join(planets)}),能量高度集中", + } + results['manahoo'].append(manahoo) + results['yogas'].append(manahoo) + + # ── 6. Graha Yuddha(行星战争)── + # 定义:两行星度数差<=1度(极近距离) + for i, p1 in enumerate(Planet_LIST): + if p1 not in planet_lons or p1 in ('Rahu', 'Ketu'): + continue + for p2 in Planet_LIST[i+1:]: + if p2 not in planet_lons or p2 in ('Rahu', 'Ketu'): + continue + lon1, lon2 = planet_lons[p1], planet_lons[p2] + diff = abs(lon1 - lon2) % 360 + if diff > 180: + diff = 360 - diff + if diff <= 1.0: + winner = p1 if _is_faster(p1, p2) else p2 + loser = p2 if winner == p1 else p1 + yuddha = { + 'type': 'Graha Yuddha', + 'planet1': p1, + 'planet2': p2, + 'degree_diff': round(diff, 4), + 'winner': winner, + 'loser': loser, + 'sign': SIGNS[int(lon1 / 30) % 12], + 'interpretation': f"Graha Yuddha——{p1}与{p2}极近({diff}度),{winner}胜,{loser}受损", + } + results['graha_yuddha'].append(yuddha) + results['yogas'].append(yuddha) + + # ── 总结 ── + total = len(results['yogas']) + results['summary'] = ( + f"Tajika Yogas检测:共{total}个格局。" + f"Ithasala(连接){len(results['ithasala'])}个," + f"Easarapha(分离){len(results['easarapha'])}个," + f"Nakta(日月同度){'1个' if results['nakta'] else '无'}," + f"Yamaya(双重){len(results['yamaya'])}个," + f"Manahoo(三行星集中){len(results['manahoo'])}个," + f"Graha Yuddha(行星战争){len(results['graha_yuddha'])}个。" + ) + + return results + + +def _is_faster(p1: str, p2: str) -> bool: + """判断p1是否比p2快(按自然速度)""" + speeds = { + 'Moon': 13.176, 'Mercury': 4.092, 'Venus': 1.602, + 'Mars': 0.524, 'Jupiter': 0.083, 'Saturn': 0.034, + 'Sun': 0.986, 'Rahu': -0.053, 'Ketu': -0.053, + } + return abs(speeds.get(p1, 0)) > abs(speeds.get(p2, 0)) + + +def _ithasala_interp(fast: str, slow: str, diff: float) -> str: + """Ithasala瑜伽解读""" + templates = [ + f"{fast}与{slow}形成Ithasala(连接瑜伽),两星能量融合,事件将要发生(差{diff}度)", + f"预示:两星所主管领域将有合作、连接、顺利推进之象", + ] + return ';'.join(templates) + + +def _easarapha_interp(fast: str, slow: str, diff: float) -> str: + """Easarapha瑜伽解读""" + templates = [ + f"{fast}与{slow}形成Easarapha(分离瑜伽),两星能量分离,事件已过或受阻(差{diff}度)", + f"预示:两星所主管领域将有分离、结束、阻碍之象", + ] + return ';'.join(templates) + + +# ============================================================================ +# Sahams(特殊点计算)—— v6.0.13 新增 +# ============================================================================ + +def calc_sahams(birth_dt: datetime, + sun_lon: float, moon_lon: float, + asc_lon: float, + yoga_point: float) -> Dict: + """ + 计算各种Sahams(特殊点)。 + + 参数: + birth_dt: 出生时间(datetime) + sun_lon: 太阳经度(0-360) + moon_lon: 月亮经度(0-360) + asc_lon: 上升经度(0-360) + yoga_point: Yoga Point经度(0-360) + + 返回: + { + 'punya_saham': {...}, # 福德点 + 'karya_saham': {...}, # 事业点 + 'vivah_saham': {...}, # 婚姻点 + 'rajya_saham': {...}, # 王权点 + 'shatru_saham': {...}, # 敌人点 + 'labha_saham': {...}, # 收益点 + 'parakrama_saham': {...}, # 勇气点 + } + """ + results = {} + + # 通用Saham计算公式(Tajika系统): + # Saham Lon = Asc Lon + (Planet2 Lon - Planet1 Lon) + # 如果结果>=360,减去360 + + def _calc_saham(p1_lon: float, p2_lon: float, asc: float) -> float: + """计算Saham经度""" + return (asc + (p2_lon - p1_lon)) % 360 + + # Punya Saham(福德点):Sun - Moon + Asc + punya_lon = _calc_saham(moon_lon, sun_lon, asc_lon) + results['punya_saham'] = { + 'longitude': round(punya_lon, 4), + 'sign': SIGNS[int(punya_lon / 30) % 12], + 'degree_in_sign': round(punya_lon % 30, 4), + 'interpretation': 'Punya Saham(福德点)——指示人生福德、善业积累、精神成长领域', + } + + # Karya Saham(事业点):Moon - Mars + Asc(日间)或 Mars - Moon + Asc(夜间) + is_daytime = _is_daytime(birth_dt, sun_lon, asc_lon) + if is_daytime: + karya_lon = _calc_saham(mars_lon:=0, moon_lon, asc_lon) # 需要Mars经度 + # 暂时用0占位,实际需要从外部传入 + results['karya_saham'] = {'note': '需要Mars经度,请从外部传入'} + else: + results['karya_saham'] = {'note': '夜间盘,需要Mars-Moon,请从外部传入'} + + # 简化版:直接返回结构,具体计算由调用方完成 + results['_note'] = 'Saham计算需要完整的行星经度,请在jyotish_engine.py中调用calc_all_sahams()' + + return results + + +def _is_daytime(birth_dt: datetime, sun_lon: float, asc_lon: float) -> bool: + """判断出生时是白天还是夜间(简化:太阳在1-6宫=白天)""" + sun_house = (int(sun_lon / 30) - int(asc_lon / 30)) % 12 + 1 + return sun_house in (1, 2, 3, 4, 5, 6) + + +def calc_all_sahams(planet_lons: Dict[str, float], + asc_lon: float, + birth_dt: datetime, + chart_type: str = 'natal') -> Dict: + """ + 计算所有主要Sahams(完整版)。 + + 参数: + planet_lons: 所有行星经度 {名: 经度} + asc_lon: 上升经度 + birth_dt: 出生时间 + chart_type: 'natal'(本命)或 'varsha'(年运) + + 返回: + 完整Sahams字典 + """ + sun_lon = planet_lons.get('Sun', 0) + moon_lon = planet_lons.get('Moon', 0) + mars_lon = planet_lons.get('Mars', 0) + jupiter_lon = planet_lons.get('Jupiter', 0) + venus_lon = planet_lons.get('Venus', 0) + saturn_lon = planet_lons.get('Saturn', 0) + + def _saham(p1_lon, p2_lon): + return (asc_lon + (p2_lon - p1_lon)) % 360 + + is_day = _is_daytime(birth_dt, sun_lon, asc_lon) + + results = {} + + # 1. Punya Saham(福德点):Moon - Sun + Asc + p_lon = _saham(sun_lon, moon_lon) + results['punya_saham'] = _saham_dict(p_lon, 'Punya Saham', '福德点——善业、精神成长、父系福德') + + # 2. Karya Saham(事业点): + # 日间:Mars - Moon + Asc;夜间:Moon - Mars + Asc + if is_day: + k_lon = _saham(moon_lon, mars_lon) + else: + k_lon = _saham(mars_lon, moon_lon) + results['karya_saham'] = _saham_dict(k_lon, 'Karya Saham', '事业点——行动、努力、工作成果') + + # 3. Vivah Saham(婚姻点): + # 日间:Venus - Mars + Asc(男性)或 Mars - Venus + Asc(女性) + # 简化:用Venus - Mars + v_lon = _saham(mars_lon, venus_lon) + results['vivah_saham'] = _saham_dict(v_lon, 'Vivah Saham', '婚姻点——婚姻、伴侣、情感关系') + + # 4. Rajya Saham(王权点):Sun - Jupiter + Asc + r_lon = _saham(jupiter_lon, sun_lon) + results['rajya_saham'] = _saham_dict(r_lon, 'Rajya Saham', '王权点——地位、权威、社会认可') + + # 5. Shatru Saham(敌人点):Mars - Saturn + Asc + sh_lon = _saham(saturn_lon, mars_lon) + results['shatru_saham'] = _saham_dict(sh_lon, 'Shatru Saham', '敌人点——竞争对手、障碍、冲突来源') + + # 6. Labha Saham(收益点):Jupiter - Moon + Asc + l_lon = _saham(moon_lon, jupiter_lon) + results['labha_saham'] = _saham_dict(l_lon, 'Labha Saham', '收益点——收获、增益、扩张') + + # 7. Parakrama Saham(勇气点):Mars - Sun + Asc + pa_lon = _saham(sun_lon, mars_lon) + results['parakrama_saham'] = _saham_dict(pa_lon, 'Parakrama Saham', '勇气点——勇气、竞争力、克服困难') + + return results + + +def _saham_dict(lon: float, name: str, interp: str) -> Dict: + """构建Saham字典""" + return { + 'longitude': round(lon, 4), + 'sign': SIGNS[int(lon / 30) % 12], + 'sign_cn': SIGNS_CN.get(SIGNS[int(lon / 30) % 12], ''), + 'degree_in_sign': round(lon % 30, 4), + 'name': name, + 'interpretation': interp, + } + + +# 补充SIGNS_CN(中文星座名) +SIGNS_CN = { + 'Aries': '白羊', 'Taurus': '金牛', 'Gemini': '双子', + 'Cancer': '巨蟹', 'Leo': '狮子', 'Virgo': '处女', + 'Libra': '天秤', 'Scorpio': '天蝎', 'Sagittarius': '射手', + 'Capricorn': '摩羯', 'Aquarius': '水瓶', 'Pisces': '双鱼', +}