파이썬 : None을 빈 문자열로 변환하는 가장 관용적 인 방법은 무엇입니까?


156

다음을 수행하는 가장 관용적 인 방법은 무엇입니까?

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

업데이트 : str (s)을 사용하는 Tryptich의 제안을 통합하여 문자열 이외의 다른 유형 에서이 루틴을 작동시킵니다. Vinay Sajip의 람다 제안에 크게 감명을 받았지만 코드를 비교적 간단하게 유지하고 싶습니다.

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)

7
나는 당신의 원래 문법을 좋아합니다. 나는 이미 꽤 명확하고 읽기 쉽다고 생각합니다.
GuiSim 2016 년

1
@GuiSim : 편견이있을 수 있지만 제 대답은 거의 일반적인 영어 문장처럼 읽습니다.
SilentGhost

1
"s가 None이면 빈 문자열을 반환하고 그렇지 않으면 [string of] s를 반환합니다." 질문의 코드는 일반적인 영어 문장처럼 읽습니다.

a) 문자열 s이 키를 찾을 수없는 dict 조회에서 나온 경우dict.get(key, '')
smci

b) 출력 형식 (예 : 인쇄)을 위해이 문자열 변환 만 원하는 경우 '... {}'. format (dict.get (1))`
smci

답변:


94

실제로 함수가 str()내장 함수처럼 동작하기를 원 하지만 인수가 None 일 때 빈 문자열을 반환하려면 다음과 같이하십시오.

def xstr(s):
    if s is None:
        return ''
    return str(s)

나는 다른 것을 유지하고 있지만 str (s) 팁 덕분에 여러 유형을 처리 할 수 ​​있습니다. 좋은!
Mark Harrison

11
또는 간단히xstr = lambda s: '' if s is None else str(s)
Michael Mior

2
if not s:대신 타이핑 을 좋아합니다if s is None
guneysus

6
@guneysus 그들은 같지 not False == True않지만 : False is None == False.
Lynn

감사합니다 @ 린 당신이 맞아요. 나는 내 잘못을 깨달았다. 그러나 나는 s항상 str / unicode 유형 또는 알고 있습니다 (또는 가정) None. 예, False가치는 있지만 키보드와 눈을 절약하는이 방법을 선호합니다.)
guneysus

143
def xstr(s):
    return '' if s is None else str(s)

3
이 구문은 2.5에서 소개되었습니다. 이전 버전의 Python에서는을 사용할 수 있습니다 return s is not None and s or ''.
벤 블랭크

8
나는 더 많은 commen 경우를 강조하기 위해 그것을 돌릴 것입니다 : s가 None이 아니면 return s ""
Ber

5
@Ber : 이중 부정을 피하기 위해 그대로 유지합니다.
Nikhil Chelliah 2016 년

8
이것은 .. and .. or ..실패와 if-else가 선호되는 이유에 대한 좋은 예입니다 . 에 두 가지 미묘한 버그가 s is not None and s or ''있습니다.

1
return '' if not s else str(s)
Iqbal

107

아마도 가장 짧은 것은 str(s or '')

None이 False이므로 x가 false이면 "x 또는 y"는 y를 반환합니다. 자세한 설명 은 부울 연산자 를 참조하십시오 . 짧지 만 명시 적이지는 않습니다.


1
정말 대단합니다, 감사합니다! or이 방법 을 사용하지 않았다
user25064

15
경우에 작동하지 않습니다 s, 거짓 0, 또는 falsy 값
wisbucky

4
글쎄, 그것은 op의 요구 사항에 언급되지 않았으므로 여기에 당신의 요점이 보이지 않습니다.
dorvak

2
@dorvak OP는 출력이 ''iff 이어야한다는 요구 사항에 대해 매우 명백합니다 s is None. 다른 모든 입력은 반환해야합니다 s(또는 str(s)수정 된 요청).
StvnW

2
@ fortea : 작동하지 않습니다. 경우 s이며 None, 결과는 xstr()빈 문자열해야하지만 str(None)문자열 제공 "None"문자열이 있기 때문에 (반환되는 것입니다, "None"falsy 값이 아닙니다합니다.
dreamlax

97

값이 항상 문자열이거나 없음임을 알고있는 경우 :

xstr = lambda s: s or ""

print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''

1
훨씬 더 pythonic. 파이썬이 None, 빈 목록, 빈 문자열, 0 등을 false로 취급한다는 사실을 사용합니다. 또한 or 문이 true 인 첫 번째 요소 또는 or (또는 ors 그룹)에 제공된 마지막 요소를 반환한다는 사실을 사용합니다. 또한 이것은 람다 함수를 사용합니다. 나는 당신에게 +10을 줄 것이지만 분명히 그것은 나를 못하게합니다.
Matt

11
이것은 0과 False (및 bool ()에 전달 될 때 False로 평가되는 다른 것)를 변환합니다
Arkady

9
나는 그것이 "지금까지 가장 pythonic"이라고 생각하지 않습니다. 다른 언어의 일반적인 관용구이며 파이썬에서 사용하는 것이 잘못이라고 생각하지 않지만 이와 같은 트릭을 피하기 위해 정확하게 도입 된 조건부 표현식입니다.
Roberto Bonvallet

2
이로 인해 [], {}None은 원하지 않는 것과 동일한 결과를 제공합니다 . xstr(False)특히,해야 "False"대신 "". 람다를 남용하면 좋지 않은 예가 def xstr(s): return s or ""될 수 있습니다.

5
처음에 "값이 항상 문자열이거나 없음이라는 것을 알고있는 경우"로 답을 확인했습니다.
Vinay Sajip

59

return s or '' 명시된 문제에 대해 잘 작동합니다!


4
이것은 s가 False 또는 0 일 때 (원래 문자열 질문이 아니라 업데이트 된 질문) 다른 결과를 제공한다는 점에 주목할 가치가 있습니다.
Oddthinking

@Oddthinking s = False또는 s = 0대부분 그것의 사용 가장자리 케이스가 될 것입니다 쉽게로 작성하여 완화 될 수있다return str(s or '')
윌렘 반 Ketwich

@WillemvanKetwich : 정확히 같은 문제가 있습니다 : s (False)는 ''가 아닌 'False'를 반환해야합니다. s (0)은 ''가 아닌 '0'을 반환해야합니다. __bool__ 또는 __nonzero__를 정의하는 객체도 마찬가지입니다.
Oddthinking

@Oddthinking 당신의 요점을 참조하십시오. 어쨌든 OP의 질문과 같은 문자열 객체에만 독점적으로 사용되는 경우 문제가되지 않습니다.
Willem van Ketwich

@WillemvanKetwich : 내 의견에서 업데이트 된 질문과주의 사항을 살펴보십시오.이 내용은 다음과 같습니다.
Oddthinking


8

기능적인 방법 (한 줄짜리)

xstr = lambda s: '' if s is None else s

1
"def xstr (s) : return ''if s is None else s"도 on-liner이고, 파이썬은 결국 공백만큼 엄격하지 않습니다
SilentGhost

2
그것은 실제로 하나의 라이너가 아니며, 단지 한 줄로 작성되었습니다 g
Dario

1
어떤 의미에서 그것은 실제 온라인 사용자가 아닌가? 통역사를 확인하십시오-구문 오류가 아닙니다. 모든 의도와 목적을 위해 그것은 람다보다 실제입니다 ^ _ ^
SilentGhost

2
람다를 변수에 할당하는 대신 def를 사용해야하는 PEP 8 종. 람다의 유일한 장점은 표현식의 일부로 작성할 수 있고 (예를 들어 다른 함수로 전달) 이와 같은 코드에서 이점이 손실된다는 것입니다. 나는 def가 한 줄로 쓰여질 수 있음을 알기 전까지이 작업을 수행했으며 PEP 8은 나에게 갈 길을 보여주었습니다. 항상 파이썬 신을 따르십시오.
Guy

8

다른 답변 중 일부 에서이 건물을 수행하는 깔끔한 한 라이너 :

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

또는 심지어 :

s = (a or '') + (b or '')

왜 언급 (lambda v: v or '')합니까?
Tvde1

왜 안돼? 1의 가격에 대한 2 가지 팁! 😀
Willem van Ketwich

1
양해하여 주시기 바랍니다 False목록도 '로 전환되고 빈.
Nik O'Lai

0등 동일
Walter Tross

6
def xstr(s):
    return {None:''}.get(s, s)

제 생각 엔 그것은 파이썬이 아니라고 생각합니다. "xstr = lambda s : {None : ''}. get (s, s)"는 모든 것을 하나의 라이너로 줄입니다.
Juergen 2016 년

14
불필요하게 속도가 느리고 (추가 구성 및 조회) 읽기가 더 어렵습니다. 꽤 비현실적입니다.
Triptych 2016 년

네가 옳아. 오히려 끔찍하지만 파이썬 바이트 코드에서 조건부 점프를 피합니다.
tobidope 2016 년

4
get () 함수 호출은 하나 이상의 추가 조건부 점프를 의미합니다.
Triptych 2016 년

1
나는 질문을 알지 못하거나 찾아 보지 않고 어떻게해야하는지 말할 수 없었다 get.
Dario

5

최대 기능을 사용합니다.

max(None, '')  #Returns blank
max("Hello",'') #Returns Hello

매력처럼 작동합니다.) 함수의 첫 번째 매개 변수에 문자열을 넣으십시오.


5
이것은 'str'> 'NoneType'이기 때문에 작동하며 CPython에 따라 다릅니다. 로부터 수동 : "번호를 제외한 다른 유형의 객체는 자신의 형 이름으로 정렬됩니다." 또한 유형 간 비교가 더 이상 허용되지 않기 때문에 Python 3000에서는 작동하지 않습니다 (TypeError : unorderable types : str ()> NoneType ()). 파이썬은 문자열과 int를 어떻게 비교합니까?를
plok

python 3.x 호환 코드로 진행하는 것은 좋지 않으므로 감사합니다.
radtek

4

Python 2.4와 호환되어야하는 경우 위의 변형

xstr = lambda s: s is not None and s or ''

2

문자열 형식화와 관련하여 다음을 수행 할 수 있습니다.

from string import Formatter

class NoneAsEmptyFormatter(Formatter):
    def get_value(self, key, args, kwargs):
        v = super().get_value(key, args, kwargs)
        return '' if v is None else v

fmt = NoneAsEmptyFormatter()
s = fmt.format('{}{}', a, b)

1
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))

5
이것은 거짓과 같은 모든 값에 대해 빈 문자열을 반환하며 이는 포스터가 요구 한 것이 아닙니다.
Triptych 2016 년

1

아래 설명 된 시나리오에서는 항상 유형 캐스팅을 피할 수 있습니다.

customer = "John"
name = str(customer)
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + name

위의 예에서 변수 customer의 값이 None 인 경우 'name'에 할당되는 동안 더 캐스팅됩니다. 'if'절의 비교는 항상 실패합니다.

customer = "John" # even though its None still it will work properly.
name = customer
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + str(name)

위의 예는 제대로 작동합니다. 이러한 시나리오는 URL, JSON 또는 XML에서 값을 가져 오거나 조작을 위해 추가 유형 캐스팅이 필요한 경우에 매우 일반적입니다.


0

단락 평가 사용 :

s = a or '' + b or ''

+는 문자열에서 잘 작동하지 않으므로 형식 문자열을 더 잘 사용하십시오.

s = "%s%s" % (a or '', b or '')

2
이것은 또한 'a'를 None뿐만 아니라 모든 false와 같은 값에 대해 빈 문자열로 변환합니다. 예를 들어 빈 튜플, 목록 및 dicts는 빈 문자열로 변환되며 이는 OP가 지정한 것과 다릅니다.
Triptych 2016 년

+두 문자열에 대해 완벽하게 좋은 연산자입니다. 당신이 문제가있는 수십에 가입하기 위해 그것을 사용하려고 할 때입니다. 두 가지 경우 아마도 다른 옵션보다 빠를 것입니다. 어느 쪽이든, 그것은 소음에 있습니다.
kquinn

나를 위해 +1이기 때문에 이것이 내 경우에 정확히 필요한 것입니다. 단일 연산자 를 대체하는 람다 또는 함수 ( or)는 약간 과잉 일 것 같습니다 ... 나는 다른 잘못된 값의 사례가 없습니다-str 또는 None. 상의 주석 이외의 +특정 시나리오에 따라 수와 벤치마킹해야 할 수도 사업자, 이 대답은 않습니다 하지 -1 자격
도시

-3

Python v3.7을 사용하는 경우 F 문자열을 사용하십시오.

xstr = F"{s}"

1
이것은 잘못되었으며 문자열을 반환합니다 'None' 하는 경우 s입니다 None.
Lawrence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.