(cls, arg: str, listmode: bool = True)
r"""
        Shield an argument against both splitting by NVCC's list-argument
        parse logic, and interpretation by any shell.

        NVCC seems to consider every comma , that is neither escaped by \ nor inside
        a double-quoted string a split-point. Single-quotes do not provide protection
        against splitting; In fact, after splitting they are \-escaped. Unfortunately,
        double-quotes don't protect against shell expansion. What follows is a
        complex dance to accommodate everybody.
r"""
        Shield an argument against both splitting by NVCC's list-argument
        parse logic, and interpretation by any shell.
r Shield an argument against both splitting by NVCC s list - argument parse logic and interpretation by any shell .
def _shield_nvcc_list_arg(cls, arg: str, listmode: bool = True) -> str:
        r"""
        Shield an argument against both splitting by NVCC's list-argument
        parse logic, and interpretation by any shell.

        NVCC seems to consider every comma , that is neither escaped by \ nor inside
        a double-quoted string a split-point. Single-quotes do not provide protection
        against splitting; In fact, after splitting they are \-escaped. Unfortunately,
        double-quotes don't protect against shell expansion. What follows is a
        complex dance to accommodate everybody.
        """

        SQ = "'"
        DQ = '"'
        CM = ","
        BS = "\\"
        DQSQ = DQ+SQ+DQ
        quotable = set(string.whitespace+'"$`\\')

        if CM not in arg or not listmode:
            if SQ not in arg:
                # If any of the special characters "$`\ or whitespace are present, single-quote.
                # Otherwise return bare.
                if set(arg).intersection(quotable):
                    return SQ+arg+SQ
                else:
                    return arg # Easy case: no splits, no quoting.
            else:
                # There are single quotes. Double-quote them, and single-quote the
                # strings between them.
                l = [cls._shield_nvcc_list_arg(s) for s in arg.split(SQ)]
                l = sum([[s, DQSQ] for s in l][:-1], [])  # Interleave l with DQSQs
                return ''.join(l)
        else:
            # A comma is present, and list mode was active.
            # We apply (what we guess is) the (primitive) NVCC splitting rule:
            l = ['']
            instring = False
            argit = iter(arg)
            for c in argit:
                if   c == CM and not instring:
                    l.append('')
                elif c == DQ:
                    l[-1] += c
                    instring = not instring
                elif c == BS:
                    try:
                        l[-1] += next(argit)
                    except StopIteration:
                        break
                else:
                    l[-1] += c

            # Shield individual strings, without listmode, then return them with
            # escaped commas between them.
            l = [cls._shield_nvcc_list_arg(s, listmode=False) for s in l]
            return r'\,'.join(l)
def _shield_nvcc_list_arg ( cls , arg : str , listmode : bool = True ) -> str : SQ = "'" DQ = '"' CM = "," BS = "\\" DQSQ = DQ + SQ + DQ quotable = set ( string . whitespace + '"$`\\' ) if CM not in arg or not listmode : if SQ not in arg : # If any of the special characters "$`\ or whitespace are present, single-quote. # Otherwise return bare. if set ( arg ) . intersection ( quotable ) : return SQ + arg + SQ else : return arg # Easy case: no splits, no quoting. else : # There are single quotes. Double-quote them, and single-quote the # strings between them. l = [ cls . _shield_nvcc_list_arg ( s ) for s in arg . split ( SQ ) ] l = sum ( [ [ s , DQSQ ] for s in l ] [ : - 1 ] , [ ] ) # Interleave l with DQSQs return '' . join ( l ) else : # A comma is present, and list mode was active. # We apply (what we guess is) the (primitive) NVCC splitting rule: l = [ '' ] instring = False argit = iter ( arg ) for c in argit : if c == CM and not instring : l . append ( '' ) elif c == DQ : l [ - 1 ] += c instring = not instring elif c == BS : try : l [ - 1 ] += next ( argit ) except StopIteration : break else : l [ - 1 ] += c # Shield individual strings, without listmode, then return them with # escaped commas between them. l = [ cls . _shield_nvcc_list_arg ( s , listmode = False ) for s in l ] return r'\,' . join ( l )