Skip to content

Commit 4f1e6bb

Browse files
authored
Merge pull request Unidata#2269 from sgdecker/treenode1_repr
Add `__repr__` to TreeNode objects
2 parents ac602b2 + 7337416 commit 4f1e6bb

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

src/metpy/io/metar.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import numpy as np
1212
import pandas as pd
1313

14-
from ._metar_parser.metar_parser import parse, ParseError
14+
from ._metar_parser.metar_parser import parse, ParseError, TreeNode
1515
from ._tools import open_as_needed
1616
from .station_data import station_info
1717
from ..package_tools import Exporter
@@ -61,6 +61,23 @@
6161
'current_wx3_symbol': None}
6262

6363

64+
def _tree_repr_(self):
65+
"""Produce string representation of a TreeNodex object."""
66+
rep = self.__class__.__name__ + '('
67+
args = []
68+
for key, value in self.__dict__.items():
69+
if key == 'elements':
70+
continue
71+
args.append(key + '=' + repr(value))
72+
dict_str = ', '.join(args) + ')'
73+
rep += dict_str
74+
return rep
75+
76+
77+
# Monkey patch to improve debugging
78+
TreeNode.__repr__ = _tree_repr_
79+
80+
6481
@exporter.export
6582
def parse_metar_to_dataframe(metar_text, *, year=None, month=None):
6683
"""Parse a single METAR report into a Pandas DataFrame.

tests/io/test_metar.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from metpy.cbook import get_test_data
1212
from metpy.io import parse_metar_file, parse_metar_to_dataframe
13+
from metpy.io._metar_parser.metar_parser import parse
1314
from metpy.io.metar import Metar, parse_metar
1415
from metpy.units import units
1516

@@ -352,3 +353,29 @@ def test_parse_no_pint_objects_in_df():
352353
for df in (parse_metar_file(input_file), parse_metar_to_dataframe(metar_str)):
353354
for column in df:
354355
assert not isinstance(df[column][0], units.Quantity)
356+
357+
358+
def test_repr():
359+
"""Test that the TreeNode string representation works."""
360+
str1 = 'KSMQ 201953Z AUTO VRB05KT 10SM CLR 03/M10 A3026'
361+
tree = parse(str1)
362+
rep = repr(tree)
363+
assert rep == ("TreeNode1(text='KSMQ 201953Z AUTO VRB05KT 10SM CLR 03/M10 A3026', "
364+
"offset=0, metar=TreeNode(text='', offset=0), "
365+
"siteid=TreeNode(text='KSMQ', offset=0), "
366+
"datetime=TreeNode2(text=' 201953Z', offset=4, "
367+
"sep=TreeNode(text=' ', offset=4)), "
368+
"auto=TreeNode(text=' AUTO', offset=12), "
369+
"wind=TreeNode4(text=' VRB05KT', offset=17, "
370+
"wind_dir=TreeNode(text='VRB', offset=18), "
371+
"wind_spd=TreeNode(text='05', offset=21), "
372+
"gust=TreeNode(text='', offset=23)), "
373+
"vis=TreeNode6(text=' 10SM', offset=25, "
374+
"sep=TreeNode(text=' ', offset=25)), run=TreeNode(text='', offset=30), "
375+
"curwx=TreeNode(text='', offset=30), "
376+
"skyc=TreeNode(text=' CLR', offset=30), "
377+
"temp_dewp=TreeNode13(text=' 03/M10', offset=34, "
378+
"sep=TreeNode(text=' ', offset=34), temp=TreeNode(text='03', offset=35), "
379+
"dewp=TreeNode(text='M10', offset=38)), "
380+
"altim=TreeNode(text=' A3026', offset=41), "
381+
"remarks=TreeNode(text='', offset=47), end=TreeNode(text='', offset=47))")

0 commit comments

Comments
 (0)