Come risolvere TypeError: unsupported operand type(s) per -: 'str' e 'str' in Python
OK. Le probabilità sono che quegli "operandi" dovrebbero essere stati convertiti in tipi numerici (come int) ad un certo punto. In questo caso, TL;DR e leggi la risposta di Tony Flury, che lo spiega accuratamente, meglio di quanto potrei fare io.
Tuttavia, c'è ancora una possibilità che tu fossi ben consapevole che queste erano stringhe (diciamo, a e b), e volevi sottrarle comunque. In questo caso, assumiamo che il risultato desiderato fosse la cosa più ragionevole da aspettarsi, che, per me, è rimuovere ogni occorrenza di b da a.
Se trovate questa assunzione troppo pericolosa, allora questo spiega automaticamente perché non c'è un operatore predefinito per la sottrazione di stringhe in Python. (a parte, naturalmente, il fatto che porterebbe a risultati sconcertanti, come '150'-'5' == '10', e che questo tipo di sottrazione non è simmetrico all'addizione, il che significa che a-b+b non porterebbe quasi mai ad a, a meno che b si trovi solo una volta, alla fine di a).
Le buone notizie sono che c'è un metodo per le stringhe che può ottenere questo facilmente, chiamato replace, quindi, chiamandolo su una stringa per sostituire una sottostringa con una vuota, farebbe il trucco. Per esempio, per rimuovere "bad" dalla stringa "questo è un cattivo esempio", si potrebbe scrivere
- 'questo è un cattivo esempio'.replace('bad', '')
However, if you find that using ‘-’ operator on strings is critical for the readability of your code, you can always create a new string subclass that implements this behavior.
Then, having started with arithmetic operations on strings, why not division, too? Not too apparent what we would expect it to do, though…
Let’s say, that when called with a string as second operand, it splits the first one by that, or, with an int (say n) as a second operand, it ‘divides’ the string to n, same-sized segments.
What about the remainder? Well, let’s implement that, too. A mod, it is :-)
- # Some preparation stuff for the example to work in both Py2 & 3...
- from six import PY2, integer_types
- if PY2:
- from types import StringType
- else:
- StringType = str
- class Thong(StringType):
- """ A string ... with extras """
- def __sub__(self, other):
- """ Remove from self all occurrences of 'other' """
- return self.replace(other, '')
- def __div__(self, other):
- """ String division:
- if 'other' is a string, split self by that string
- if 'other' is a number, slice self in that number of same-sized
- segments
- regretfully, not symmetric with multiplication """
- if isinstance(other, (integer_types, float)):
- seglen = int(len(self)/other)
- return [self[n-seglen:n] for n in range(seglen, len(self)+1, seglen)]
- # else: # possibly isinstance(other, (string_types))
- return self.split(other)
- def __mod__(self, other):
- """ String modulo:
- Return what remained from string division with 'other' """
- # if isinstance(other, (integer_types, float)):
- # let it raise for incompatible types
- seglen = int(len(self)/other)
- return self[other*seglen:]
- # examples
- if __name__ == '__main__':
- t = Thong("this is a test string")
- print(t - "is")
- print(t / 5)
- print(t % 5)
- # note that we also get -= as a bonus :-)
- t-="a "
- print(t)
OK, OK, this is the kind of meaningless operator overloading that Linus used to criticize on C++ …
But when programming purely for fun, I guess it doesn’t hurt :-)
Articoli simili
- Cosa significa 'Errore: Può solo concatenare str (non "int") a str' significa in Python?
- L'USB type-C sostituirà l'USB type -A e quanto tempo ci vorrà prima che sia mainstream?
- Gli auricolari USB type-C funzionano su qualsiasi telefono con una porta type-C?
- Qual è la differenza tra USB Type-A e USB Type-C?