Wie kann ich überprüfen, ob ein Python-Objekt eine Zeichenkette ist (entweder regulär oder Unicode)?
Antworten
Zu viele Anzeigen?Heute Abend bin ich in eine Situation geraten, in der ich Gedanken Ich wollte das mit der str
Typ, aber es stellte sich heraus, dass ich das nicht tat.
Mein Ansatz zur Lösung des Problems wird wahrscheinlich in vielen Situationen funktionieren, daher biete ich ihn unten an, falls andere, die diese Frage lesen, daran interessiert sind (nur Python 3).
# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
'''Take a field sequence definition and yield from a validated
field sequence. Accepts a string, a string with separators,
or a sequence of strings'''
if fields:
try:
# single unpack in the case of a single argument
fieldseq, = fields
try:
# convert to string sequence if string
fieldseq = fieldseq.split(sep)
except AttributeError:
# not a string; assume other iterable
pass
except ValueError:
# not a single argument and not a string
fieldseq = fields
invalid_fields = [field for field in fieldseq if not validator(field)]
if invalid_fields:
raise ValueError('One or more field names is invalid:\n'
'{!r}'.format(invalid_fields))
else:
raise ValueError('No fields were provided')
try:
yield from fieldseq
except TypeError as e:
raise ValueError('Single field argument must be a string'
'or an interable') from e
Einige Tests:
from . import getfields
def test_getfields_novalidation():
result = ['a', 'b']
assert list(getfields('a b')) == result
assert list(getfields('a,b', sep=',')) == result
assert list(getfields('a', 'b')) == result
assert list(getfields(['a', 'b'])) == result
Sie können es durch Verkettung mit einer leeren Zeichenkette testen:
def is_string(s):
try:
s += ''
except:
return False
return True
bearbeiten :
Ich korrigiere meine Antwort nach Kommentaren, die darauf hinweisen, dass dies bei Listen nicht funktioniert
def is_string(s):
return isinstance(s, basestring)
Ich denke, es ist sicher anzunehmen, dass, wenn das letzte Zeichen der Ausgabe von repr()
は '
ou "
ist, dann sollte es als eine Art Schnur betrachtet werden.
def isStr(o):
return repr(o)[-1] in '\'"'
Ich gehe davon aus, dass repr
nichts allzu Schweres tut und eine Zeichenkette mit mindestens einem Zeichen zurückgibt. Sie können leere Zeichenketten unterstützen, indem Sie etwas wie
repr(o)[-1:].replace('"', "'") == "'"
aber das setzt immer noch voraus, dass repr
überhaupt eine Zeichenkette zurückgibt.
Für eine nette Duck-Typing-Ansatz für string-likes, die den Bonus der Arbeit mit beiden Python 2.x und 3.x hat:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
Klugscheißer war mit der Enten-Typisierung nahe dran, bevor er zur isinstance
Ansatz, mit der Ausnahme, dass +=
hat für Listen eine andere Bedeutung als +
tut.
- See previous answers
- Weitere Antworten anzeigen