From 2528fb5217063a5a98f7ea2b880bfc75e7f2428c Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Wed, 2 May 2018 11:22:10 -0400 Subject: Added support for customizing the pyscript bridge pystate object name. Removed all legacy pystate objects. Changed default behavior to clear _last_result before each command Added utility for creating named tuples with default values Added tests to exercise new changes. --- cmd2/utils.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'cmd2/utils.py') diff --git a/cmd2/utils.py b/cmd2/utils.py index 33215dc0..167879aa 100644 --- a/cmd2/utils.py +++ b/cmd2/utils.py @@ -2,6 +2,7 @@ # coding=utf-8 """Shared utility functions""" +import collections from . import constants def strip_ansi(text: str) -> str: @@ -11,3 +12,32 @@ def strip_ansi(text: str) -> str: :return: the same string with any ANSI escape codes removed """ return constants.ANSI_ESCAPE_RE.sub('', text) + + +def namedtuple_with_defaults(typename, field_names, default_values=()): + """ + Convenience function for defining a namedtuple with default values + + From: https://stackoverflow.com/questions/11351032/namedtuple-and-default-values-for-optional-keyword-arguments + + Examples: + >>> Node = namedtuple_with_defaults('Node', 'val left right') + >>> Node() + Node(val=None, left=None, right=None) + >>> Node = namedtuple_with_defaults('Node', 'val left right', [1, 2, 3]) + >>> Node() + Node(val=1, left=2, right=3) + >>> Node = namedtuple_with_defaults('Node', 'val left right', {'right':7}) + >>> Node() + Node(val=None, left=None, right=7) + >>> Node(4) + Node(val=4, left=None, right=7) + """ + T = collections.namedtuple(typename, field_names) + T.__new__.__defaults__ = (None,) * len(T._fields) + if isinstance(default_values, collections.Mapping): + prototype = T(**default_values) + else: + prototype = T(*default_values) + T.__new__.__defaults__ = tuple(prototype) + return T -- cgit v1.2.1