New Command: Difference between revisions

From PyMOLWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
IN ACTIVE DEVELOPMENT
IN ACTIVE DEVELOPMENT


[[new_command]] is an API-only feature which exposes a developer defined Python function as a command to other users.
[[new_command]] is a new API-only feature which exposes a developer defined Python function as a command to other users.


== In a brief ==
== In a brief ==
Line 10: Line 10:
from pymol import cmd
from pymol import cmd
from pathlib import Path
from pathlib import Path
from typing import List, Tuple, Union, Any
from typing import List, Tuple, Union, Any, Optional


Point = Tuple[float, float, float]
Point = Tuple[float, float, float]
Line 20: Line 20:
     title: str,
     title: str,
     other_point: Tuple[int, int, int] = (0, 0, 0),
     other_point: Tuple[int, int, int] = (0, 0, 0),
     dirname: Path = '.', # a bit ugly, but works as expected on command-line
     dirname: Path = Path('.'),
     this_list: Union[List[bool], None] = None,
     this_list: Optional[List[bool]] = None,
     extended_calculation: bool = True,
     extended_calculation: bool = True,
     old_style: Any = "Support anything as raw string",
     old_style: Any = "anything as string",
     quiet: bool = 1,  # special 'quiet=False' on command-line
     quiet: bool = 1,  # special 'quiet=False' on command-line
     _self=cmd  # special for multi-threaded applications
     _self=cmd  # special for multi-threaded applications
):
):
     "A cool docstring."
     "A cool docstring."
     print(this_list)
     print(locals())
</source>
 
These code blocks ahead are sample usage of the above function.
<source lang=sh>
PyMOL> nice_tool 10, 0.1 2.3 4.5, Have a nice tool, this_list=1 0 yes 0
</source>
 
<source lang=python>
{'my_var': 10, 'a_point': (0.1, 2.3, 4.5), 'title': 'Have a nice tool', 'other_point': (0, 0, 0), 'dirname': PosixPath('.'), 'this_list': [True, False, True, False], 'extended_calculation': True, 'old_style': 'anything as string', 'quiet': False, '_self': <module 'pymol.cmd' from '/home/peu/Desktop/pymol-open-source/modules/pymol/cmd.py'>}
 
 
</source>
</source>



Revision as of 13:56, 29 November 2025

IN ACTIVE DEVELOPMENT

new_command is a new API-only feature which exposes a developer defined Python function as a command to other users.

In a brief

If you need more examples, here a non exhaustive list of examples: [1]

from pymol import cmd
from pathlib import Path
from typing import List, Tuple, Union, Any, Optional

Point = Tuple[float, float, float]

@cmd.new_command
def nice_tool(
    my_var: Union[int | float],
    a_point: Point,
    title: str,
    other_point: Tuple[int, int, int] = (0, 0, 0),
    dirname: Path = Path('.'),
    this_list: Optional[List[bool]] = None,
    extended_calculation: bool = True,
    old_style: Any = "anything as string",
    quiet: bool = 1,  # special 'quiet=False' on command-line
    _self=cmd  # special for multi-threaded applications
):
    "A cool docstring."
    print(locals())

These code blocks ahead are sample usage of the above function.

PyMOL> nice_tool 10, 0.1 2.3 4.5, Have a nice tool, this_list=1 0 yes 0
{'my_var': 10, 'a_point': (0.1, 2.3, 4.5), 'title': 'Have a nice tool', 'other_point': (0, 0, 0), 'dirname': PosixPath('.'), 'this_list': [True, False, True, False], 'extended_calculation': True, 'old_style': 'anything as string', 'quiet': False, '_self': <module 'pymol.cmd' from '/home/peu/Desktop/pymol-open-source/modules/pymol/cmd.py'>}

Details

It improves on extend, the consolidated exposing mechanism, and works by parsing arguments given by users at command-line, enforcing correct types at runtime, freeing developers from it and ensuring typing strictness. It is also advantageous for developers consuming the exposed function/command directly by the API as types can also be enforced statically by MyPy.