1

when I use

from allpairspy import AllPairs

parameters = OrderedDict([('Content-Type', ['"application/json"', ' "application/xml"'])]

test_cases = list(AllPairs(parameters))

it errors the following msg:

Traceback (most recent call last):
  File "/home/nio/Documents/projects/ironball/pairwise_engine/gen_pairwise_cases.py", line 60, in <module>
    for i, pairs in enumerate(AllPairs(parameters, filter_func=is_valid_combination)):
  File "/home/nio/miniconda3/envs/kytest/lib/python3.9/site-packages/allpairspy/allpairs.py", line 60, in __init__
    self.__pairs_class = namedtuple("Pairs", self.__param_name_list)
  File "/home/nio/miniconda3/envs/kytest/lib/python3.9/collections/__init__.py", line 390, in namedtuple
    raise ValueError('Type names and field names must be valid '
ValueError: Type names and field names must be valid identifiers: 'Content-Type'

when I changed 'Content-Type' into 'Content_Type', it works. But what is the problem here? How to use 'Content-Type' directly?

1
  • namedtuple requires the field names to be valid Python identifiers. In Python, valid identifiers can only include letters, digits, and underscores, and cannot start with a digit. They also cannot include hyphens.
    – Nesi
    Commented Jul 8 at 7:05

1 Answer 1

0

There is namedtuple under the hood and both typename and field_names of a namedtuple have to be "valid identifier".

A string is considered a valid identifier if it only contains alphanumeric letters (a-z) and (0-9), or underscores (_). A valid identifier cannot start with a number, or contain any spaces.

To check this condition isidentifier method is used:

"Content-Type".isidentifier()  # False
"Content_Type".isidentifier()  # True

So, in your case it returns False and namedtuple raises and error.

Not the answer you're looking for? Browse other questions tagged or ask your own question.