{"id":18565266,"url":"https://github.com/rigetti/paranormal","last_synced_at":"2025-04-10T04:32:39.702Z","repository":{"id":54828780,"uuid":"181557632","full_name":"rigetti/paranormal","owner":"rigetti","description":"A declarative, parameter-parsing library that provides multiple parsing interfaces (YAML, command line, and JSON)","archived":false,"fork":false,"pushed_at":"2021-01-26T23:55:49.000Z","size":175,"stargazers_count":13,"open_issues_count":5,"forks_count":9,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-24T16:11:22.973Z","etag":null,"topics":["command-line","control-systems","experimentation","parsing-library"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rigetti.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-15T20:05:34.000Z","updated_at":"2024-10-09T16:19:16.000Z","dependencies_parsed_at":"2022-08-14T04:10:11.189Z","dependency_job_id":null,"html_url":"https://github.com/rigetti/paranormal","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rigetti%2Fparanormal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rigetti%2Fparanormal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rigetti%2Fparanormal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rigetti%2Fparanormal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rigetti","download_url":"https://codeload.github.com/rigetti/paranormal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248157637,"owners_count":21057047,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-line","control-systems","experimentation","parsing-library"],"created_at":"2024-11-06T22:18:08.338Z","updated_at":"2025-04-10T04:32:39.375Z","avatar_url":"https://github.com/rigetti.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# paranormal\n\nA declarative, parameter-parsing library that provides multiple parsing interfaces (YAML, command line, and JSON) for loading parameters.\n\n[![pypi version](https://img.shields.io/pypi/v/paranormal.svg)](https://pypi.org/project/paranormal/)\n\n## Python Install:\n\nJust install from PyPi using `pip install paranormal`.\n\n## Running unit tests\n\nUnit tests can be executed by running `pytest` from top folder of the repository.\n\n## Using the Library\n\nThe following code samples show how this library is meant to be used.\n\n### Subclass `Params`\n\n```python\nfrom paranormal.parameter_interface import *\nfrom paranormal.params import *\n\n# Note that only direct inheritance from Params is currently supported\nclass FrequencySweep(Params):\n    \"\"\"\n    A frequency sweep measurement\n    \"\"\"\n    freqs = SpanArangeParam(help='A list of frequencies to scan as [center, width, step]',\n                            default=(1e9, 2e9, 0.1e9), unit='GHz')\n    power = FloatParam(help='Power to transmit', default=-20, unit='dBm')\n    pulse_samples = IntParam(help='Samples in the pulse', default=100)\n    averages = IntParam(help='Number of sweeps to average over', default=10)\n    is_test = BoolParam(help='Is this just a test', default=False)\n    unseen_test = BoolParam(help='Hidden from the command line', default = False, hide=True)\n    _unseen_test_2 = BoolParam(help='Hidden from the command line bc of the _', default=False)\n\n```\n\n\n### Reading From the Command Line\n\n```python\nparser = to_argparse(FrequencySweep)\n# argparse will grab the command line arguments\n# Ex command line: '--freqs 150 100 2 --power -40 --pulse_samples 200 --is_test'\nargs = parser.parse_args()\nsweep_params = from_parsed_args(FrequencySweep, params_namespace=args)[0]\n\n# even_simpler\nsweep_params = create_parser_and_parse_args(FrequencySweep)\n```\n\n### Setting and getting parameters\n```python\nprint(sweep_params.freqs)  # prints a numpy array of size (20,) array([0.0e+00, 1.0e+08, 2.0e+08, …\nsweep_params.freqs = [5e9, 10e9, 2e9]\nprint(sweep_params.freqs)  # prints array([0.e+00, 2.e+09, 4.e+09, 6.e+09, 8.e+09])\nprint(sweep_params.is_test)  # prints True\nsweep_params.freqs = [None, 10e9, 2e9]\nprint(sweep_params.freqs)  # prints [None, 10e9, 2e9]\n```\n\n### JSON and YAML serialization\n\n```python\nimport json\nimport yaml  # pyyaml\n\nd = to_json_serializable_dict(sweep_params)\ns = json.dumps(d)\nsweep_params = from_json_serializable_dict(json.loads(s))\n\n\nto_yaml_file(sweep_params, 'test_params.yaml')\nsweep_params = from_yaml_file('test_params.yaml')\n```\n\n### Nested Params\n```python\nclass MultipleFreqSweeps(Params):\n    sweep_1 = FrequencySweep(freqs=[0, 1e9, 0.1e9])  # overwrites default freqs value\n    sweep_2 = FrequencySweep(freqs=[1e9, 2e9, 0.1e9])  # overwrites default freqs value\n    \n# Omit a nested param from the outer class:\nclass MultipleFreqSweepsHidden(Params):\n    sweep_1 = FrequencySweep(freqs='__omit__')\n    sweep_2 = FrequencySweep(power='__omit__')\n        \n# Customize prefixes used for command line parsing    \nclass MultipleFreqSweepsCustom(Params):\n    sweep_1 = FrequencySweep()\n    sweep_2 = FrequencySweep()\n    __nested_prefixes__ = {'sweep_1': None, 'sweep_2': 'second_'}\n    # Ex command line: '--freqs 100 120 2 --power -30 --second_power -40'\n    \n# Hide a nested param from the command line, but keep it in the class:\nclass MultipleFreqSweepsCustom(Params):\n    sweep_1 = FrequencySweep()\n    sweep_2 = FrequencySweep()\n    __nested_prefixes__ = {'sweep_1': None, 'sweep_2': 'second_'}\n    __params_to_hide__ = ['sweep_2_power']\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frigetti%2Fparanormal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frigetti%2Fparanormal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frigetti%2Fparanormal/lists"}