Issue #1074: LaTeX representations of units are not seriailized (yt_analysis/yt)

New issue 1074: LaTeX representations of units are not seriailized https://bitbucket.org/yt_analysis/yt/issues/1074/latex-representations-of-un... Nathan Goldbaum: This issue is illustrated by the following example (which needs to happen over the course of two python scripts). save.py: ``` #!python import yt ds = yt.load('enzo_tiny_cosmology/DD0000/DD0000') data = ds.arr([1,2,3], 'Mpccm') data.write_hdf5('my_data') ``` load.py: ``` #!python import yt yt.YTArray.from_hdf5('my_data') ``` This will crash with the following traceback: ``` #!python --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-2-a3d4124ff75c> in <module>() ----> 1 yt.YTArray.from_hdf5('my_data') /Users/goldbaum/Documents/yt-hg/yt/units/yt_array.pyc in from_hdf5(cls, filename, dataset_name) 706 f.close() 707 registry = UnitRegistry(lut=unit_lut, add_default_symbols=False) --> 708 return cls(data, units, registry=registry) 709 710 # /Users/goldbaum/Documents/yt-hg/yt/units/yt_array.pyc in __new__(cls, input_array, input_units, registry, dtype, bypass_validation) 356 # don't handle all the cases here, let the Unit class handle if 357 # it's a str. --> 358 units = Unit(input_units, registry=registry) 359 360 # Attach the units /Users/goldbaum/Documents/yt-hg/yt/units/unit_object.pyc in __new__(cls, unit_expr, base_value, base_offset, dimensions, registry, **assumptions) 202 else: 203 # lookup the unit symbols --> 204 unit_data = _get_unit_data_from_expr(unit_expr, registry.lut) 205 base_value = unit_data[0] 206 dimensions = unit_data[1] /Users/goldbaum/Documents/yt-hg/yt/units/unit_object.pyc in _get_unit_data_from_expr(unit_expr, unit_symbol_lut) 476 # Now for the sympy possibilities 477 if isinstance(unit_expr, Symbol): --> 478 return _lookup_unit_symbol(str(unit_expr), unit_symbol_lut) 479 480 if isinstance(unit_expr, Number): /Users/goldbaum/Documents/yt-hg/yt/units/unit_object.pyc in _lookup_unit_symbol(symbol_str, unit_symbol_lut) 539 sstr = symbol_str 540 latex_symbol_lut[symbol_str] = \ --> 541 latex_symbol_lut[symbol_wo_prefix].replace( 542 '{'+symbol_wo_prefix+'}', '{'+sstr+'}') 543 KeyError: 'pccm' ``` The issue is that the LaTeX version of symbols is saved in a singleton dictionary (`latex_symbol_lut`) which is not persisted between python sessions. Coming units specifically define a special LaTeX represetation, which is not available in the python session for load.py. Annoyingly, it *would* work if load.py were executed in the same python session as save.py, since the singleton dictionary would be populated with the correct values. I think the correct thing to do is to store the LaTeX representations of units in the `UnitRegistry` object itself rather than in a global singleton. Responsible: ngoldbaum
participants (1)
-
Nathan Goldbaum