8000 don't allow . in signal/system names (state names are OK) · python-control/python-control@d646017 · GitHub
[go: up one dir, main page]

Skip to content

Commit d646017

Browse files
committed
don't allow . in signal/system names (state names are OK)
1 parent c17a389 commit d646017

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

control/namedio.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
__all__ = ['issiso', 'timebase', 'common_timebase', 'timebaseEqual',
1515
'isdtime', 'isctime']
16+
1617
# Define module default parameter values
17 8000 18
_namedio_defaults = {
1819
'namedio.state_name_delim': '_',
@@ -57,6 +58,8 @@ def _name_or_default(self, name=None):
5758
if name is None:
5859
name = "sys[{}]".format(NamedIOSystem._idCounter)
5960
NamedIOSystem._idCounter += 1
61+
elif re.match(r".*\..*", name):
62+
raise ValueError(f"invalid system name '{name}' ('.' not allowed)")
6063
return name
6164

6265
# Check if system name is generic
@@ -174,7 +177,6 @@ def copy(self, name=None, use_prefix_suffix=True):
174177
return newsys
175178

176179
def set_inputs(self, inputs, prefix='u'):
177-
178180
"""Set the number/names of the system inputs.
179181
180182
Parameters
@@ -258,7 +260,7 @@ def set_states(self, states, prefix='x'):
258260
259261
"""
260262
self.nstates, self.state_index = \
261-
_process_signal_list(states, prefix=prefix)
263+
_process_signal_list(states, prefix=prefix, allow_dot=True)
262264

263265
def find_state(self, name):
264266
"""Find the index for a state given its name (`None` if not found)"""
@@ -613,7 +615,7 @@ def _process_dt_keyword(keywords, defaults={}, static=False):
613615

614616

615617
# Utility function to parse a list of signals
616-
def _process_signal_list(signals, prefix='s'):
618+
def _process_signal_list(signals, prefix='s', allow_dot=False):
617619
if signals is None:
618620
# No information provided; try and make it up later
619621
return None, {}
@@ -624,10 +626,17 @@ def _process_signal_list(signals, prefix='s'):
624626

625627
elif isinstance(signals, str):
626628
# Single string given => single signal with given name
629+
if not allow_dot and re.match(r".*\..*", signals):
630+
raise ValueError(
631+
f"invalid signal name '{signals}' ('.' not allowed)")
627632
return 1, {signals: 0}
628633

629634
elif all(isinstance(s, str) for s in signals):
630635
# Use the list of strings as the signal names
636+
for signal in signals:
637+
if not allow_dot and re.match(r".*\..*", signal):
638+
raise ValueError(
639+
f"invalid signal name '{signal}' ('.' not allowed)")
631640
return len(signals), {signals[i]: i for i in range(len(signals))}
632641

633642
else:

control/tests/namedio_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,12 @@ def test_find_signals():
323323
assert sys.find_outputs(['y', 'z']) == [0, 1, 2, 3]
324324
assert sys.find_outputs(['y[1:]', 'z']) == [1, 2, 3]
325325
assert sys.find_outputs(['y', 'z[:1]']) == [0, 1, 2, 3]
326+
327+
328+
# Invalid signal names
329+
def test_invalid_signal_names():
330+
with pytest.raises(ValueError, match="invalid signal name"):
331+
sys = ct.rss(4, inputs="input.signal", outputs=1)
332+
333+
with pytest.raises(ValueError, match="invalid system name"):
334+
sys = ct.rss(4, inputs=1, outputs=1, name="system.subsys")

0 commit comments

Comments
 (0)
0