506 Stimmen

Wie findet man heraus, ob ein Python-Objekt eine Zeichenkette ist?

Wie kann ich überprüfen, ob ein Python-Objekt eine Zeichenkette ist (entweder regulär oder Unicode)?

1voto

Rick supports Monica Punkte 38114

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

0voto

georgepsarakis Punkte 1847

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)

0voto

ArtOfWarfare Punkte 19001

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.

-4voto

William Clay Punkte 1
if type(varA) == str or type(varB) == str:
    print 'string involved'

von EDX - Online-Kurs MITx: 6.00.1x Einführung in die Informatik und Programmierung mit Python

-4voto

Alphadelta14 Punkte 2674

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X