파이썬에서 문자열을 부울로 변환 하시겠습니까?


745

파이썬에서 문자열을 부울로 변환하는 방법을 아는 사람이 있습니까? 이 링크를 찾았습니다 . 그러나 그것을하는 적절한 방법처럼 보이지는 않습니다. 즉 내장 기능 등을 사용하는 경우

내가 묻는 이유 int("string")는 여기에서 배웠기 때문 입니다. 그러나 시도 bool("string")하면 항상 다음을 반환합니다 True.

>>> bool("False")
True

2
나는 이것을 위해 마이크로 라이브러리를 만들었습니다. 여기에는 폴란드어에 대한 "tak", 폴란드어에 대한 "tak", Mandarin-Chinese의 " '是 的"가 True로 평가됩니다 . 명시 적으로 true가 아닌 경우 False로 평가됩니다 . 제안은 환영합니다. Github 링크 : github.com/kmonsoor/str2bool
kmonsoor

18
@jzwiener의 대답 은 바퀴를 재발견하고화물 컬트 해야하는 코드를 작성하는 대신 python 표준 라이브러리의 함수를distutils.util.strtobool(some_string) 사용 합니다 . 기술적으로 출력은 int값 이있는 유형 0이거나 1-> 정말로 원하거나 필요 bool하면 해당 기능을로 랩핑 할 수 있습니다 bool(distutils.util.strtobool(some_string)).
Trevor Boyd Smith

1
pip install str2bool
Symon

그냥 머리 위로. distutils.util.strtobool@kmonsoor의 솔루션과 달리 외국어 예 / 아니오를 처리 할 수는 없지만 외국어 (예 : VERO, FALSO) 에서 True / False를 사용하여 Excel로 만든 CSV 파일을 처리 할 수는 없습니다 . 따라서 때로는 바퀴 재발견이 필요합니다.
Matteo Ferla

답변:


837

실제로 문자열을 true를 나타내는 것으로 받아 들일 것으로 예상되는 것과 비교하면 다음과 같이 할 수 있습니다.

s == 'True'

또는 전체 값에 대해 확인하려면 다음을 수행하십시오.

s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

다음을 사용할 때는주의하십시오.

>>> bool("foo")
True
>>> bool("")
False

빈 문자열은로 평가 False되지만 다른 모든 항목은로 평가됩니다 True. 따라서 이것은 어떤 종류의 파싱 목적으로도 사용해서는 안됩니다.


48
+1 :보다 간단하지는 않습니다 s == "True". 그러나 나는 사람들이 이것을 엉망으로 만드는 것을 보았습니다. 데프 변환 : 만약 s == "True": return True; False를 반환합니다.
S.Lott 2016

24
if / else보다 return s == "True"를 선호합니다
Dana

26
s == "True"인 경우 : True를 반환 함 elif s == "False": False를 반환합니다. 그렇지 않으면 : return raise
Unknown

9
논리 값에 문자열을 구문 분석하는 것은 이미 distutils.util.strtobool에서 구현됩니다 stackoverflow.com/a/18472142/923599
jzwiener

9
나는 이것이 정말로 오래된 주제라는 것을 알고 있지만 코드를 디버깅하는 데 4 시간을 보냈다는 것을 증명하고 싶었다. 내 실수는 캐스팅하려고했습니다 bool("False"). 항상로 전송됩니다 True.
Ev.

304

사용하다:

bool(distutils.util.strtobool(some_string))

참값은 y, yes, t, true, on 및 1입니다. false 값은 n, no, f, false, off 및 0입니다. val이 다른 경우 ValueError가 발생합니다.

distutils.util.strtobool()정수 표현 을 리턴하므로 bool()부울 값을 얻기 위해 랩핑되어야 합니다.


38
불행히도 이것은 1/ 0not True/을 반환 False하므로 실제 부울을 얻기 위해 bool ()로 결과를 래핑해야합니다.bool(distutils.util.strtobool(some_string))
Mariusz Jamro

2
그 기능은 감탄합니다. 이 정수를 처리하고 있다면 그것은 완벽 할 것입니다 Nonestr(None)입력으로.
MarkHu

20
나는 이것을 더 높은 투표 응답보다 선호합니다 ... stdlib에서 왔으며 필요한 것을 정확하게 수행합니다. 일반적으로 / 와 같은 나쁜 일을하지 않는 한 / bool대신 실제를 필요로하는 이유 는 없습니다 ... 그리고 s와 s를 다루는 경우 특별한 기능이 필요하지 않습니다. 직접 또는10if x == FalseintNoneif myint:if not maybe_none_var:
Anentropic

4
@Secator bool의 하위 클래스int
Anentropic

2
누군가 인터넷 검색 오류를 저장하려면 distutils를 가져오고 distutils.util을 가져 와서 작동시킵니다.
Edward B.

267
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

그런 다음 이렇게 호출하십시오.

>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False

참과 거짓을 명시 적으로 다루기 :

함수가 참 단어 목록과 거짓 단어 목록을 명시 적으로 검사하도록 할 수도 있습니다. 그런 다음 목록에 없으면 예외를 던질 수 있습니다.


29
적은 향상을 사용하여 제조 될 수 있으며, STR (V) .lower () 대신 v.lower () . 그런 다음 문자열이 아니더라도 작동 할 수 있습니다. 예 : 1, 0
kmonsoor

RE : true / false를 명시 적으로 처리하면 true / false 명령 줄 프롬프트가 작동하는 방식과 같이 문자열이 일치하지 않으면 기본값을 제공 할 수도 있습니다. 계속 하시겠습니까? (y / N)
Johnus

113

JSON 파서는 또한 일반적으로 문자열을 합리적인 파이썬 유형으로 변환하는 데 유용합니다.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True

31
이 방법은 소문자 인 경우에만 작동합니다. 대문자이면 할 수 없습니다. 전화해야합니다.lower()
CppLearner 2016 년

107

Python 2.6부터는 다음이 있습니다 ast.literal_eval.

>>> 수입 ast
>>> help (ast.literal_eval)
ast 모듈의 literal_eval 함수에 대한 도움말 :

literal_eval (노드 _ 또는 _ 문자열)
    표현식 노드 또는 파이썬을 포함하는 문자열을 안전하게 평가
    표현. 제공된 문자열 또는 노드는 다음으로 만 구성 될 수 있습니다
    파이썬 리터럴 구조 : 문자열, 숫자, 튜플,리스트, dicts, booleans,
    그리고 없음.

문자열이 또는 중 하나 일 것이라고 확신 하는 한 작동하는 것 같습니다 ."True""False"

>>> ast.literal_eval ( "참")
진실
>>> ast.literal_eval ( "거짓")
그릇된
>>> ast.literal_eval ( "F")
역 추적 (가장 최근 통화) :
  ""파일, 1 행 
  literal_eval의 "/opt/Python-2.6.1/lib/python2.6/ast.py", 68 행 파일
    리턴 _convert (node_or_string)
  _convert의 파일 "/opt/Python-2.6.1/lib/python2.6/ast.py", 67 행
    ValueError ( '잘못된 문자열')
ValueError : 잘못된 문자열
>>> ast.literal_eval ( " '거짓'")
'그릇된'

일반적으로 권장하지는 않지만 완전히 내장되어 있으며 요구 사항에 따라 올바른 것이 될 수 있습니다.


1
이 솔루션의 일반적인 적용 가능성을 잘 모르지만 일반적인 방식으로 매우 좋습니다. +1!
SingleNegationElimination

3
Gaah, 끔찍하다! 그럼 다시, 당신은 않았다 당신이 그것을하지 않는 것이 좋습니다 말, 그것은 않습니다 깔끔하게 질문에 대답. 잘 찾아라!
Vanessa Phipps

4
불행히도이 경우는 처리하지 않습니다 >>> ast.literal_eval ( 'true') 또는 ast.literal_eval ( 'TRUE') 제기 >>> raise ValueError ( 'malformed string') ast.literal_eval (to_test .title ())
Bhushan

이 특별한 질문에 대한 훌륭한 해결책은 아니지만 ... 와우, literal_eval은 유용합니다! 나열, dict, 요법 할 문자열
travc

유니 코드에서 작동합니까? Django보기에서 부울로 변경하려는 들어오는 값이 있는데 잘못된 문자열 예외가 발생합니다.
Prakhar Mohan Srivastava

48

문자열이 "True"또는 중 하나 인 것을 알고 있으면 "False"사용할 수 있습니다 eval(s).

>>> eval("True")
True
>>> eval("False")
False

문자열에 유효한 Python이 포함되어 있지 않으면 예외가 발생하고 문자열에 포함 된 코드도 실행되므로 문자열의 내용이 확실하면 이것을 사용하십시오.


5
그 줄은 어딘가에서 나옵니다. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
nurettin

4
@ nurettin, 따라서 문자열의 내용이 확실하다면 그것을 사용하는 것에 대한 내 의견.
Joel Croteau 19

17

이 버전은 int (value)와 같은 생성자의 의미를 유지하고 허용 가능한 문자열 값을 쉽게 정의 할 수있는 방법을 제공합니다.

def to_bool(value):
    valid = {'true': True, 't': True, '1': True,
             'false': False, 'f': False, '0': False,
             }   

    if isinstance(value, bool):
        return value

    if not isinstance(value, basestring):
        raise ValueError('invalid literal for boolean. Not a string.')

    lower_value = value.lower()
    if lower_value in valid:
        return valid[lower_value]
    else:
        raise ValueError('invalid literal for boolean: "%s"' % value)


# Test cases
assert to_bool('true'), '"true" is True' 
assert to_bool('True'), '"True" is True' 
assert to_bool('TRue'), '"TRue" is True' 
assert to_bool('TRUE'), '"TRUE" is True' 
assert to_bool('T'), '"T" is True' 
assert to_bool('t'), '"t" is True' 
assert to_bool('1'), '"1" is True' 
assert to_bool(True), 'True is True' 
assert to_bool(u'true'), 'unicode "true" is True'

assert to_bool('false') is False, '"false" is False' 
assert to_bool('False') is False, '"False" is False' 
assert to_bool('FAlse') is False, '"FAlse" is False' 
assert to_bool('FALSE') is False, '"FALSE" is False' 
assert to_bool('F') is False, '"F" is False' 
assert to_bool('f') is False, '"f" is False' 
assert to_bool('0') is False, '"0" is False' 
assert to_bool(False) is False, 'False is False'
assert to_bool(u'false') is False, 'unicode "false" is False'

# Expect ValueError to be raised for invalid parameter...
try:
    to_bool('')
    to_bool(12)
    to_bool([])
    to_bool('yes')
    to_bool('FOObar')
except ValueError, e:
    pass

3
Nit : 마지막 "테스트 사례"는 첫 번째 호출에서 오류가 발생하고 다른 테스트는 수행하지 않습니다. 또한 오류가 발생하지 않으면 실패 하지 않습니다 .
augurar

12

여기 내 버전이 있습니다. 양수 및 음수 목록을 모두 확인하여 알 수없는 값에 대한 예외를 발생시킵니다. 그리고 문자열을받지 않지만 모든 유형이 수행해야합니다.

def to_bool(value):
    """
       Converts 'something' to boolean. Raises exception for invalid formats
           Possible True  values: 1, True, "1", "TRue", "yes", "y", "t"
           Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
    """
    if str(value).lower() in ("yes", "y", "true",  "t", "1"): return True
    if str(value).lower() in ("no",  "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
    raise Exception('Invalid value for boolean conversion: ' + str(value))

샘플 실행 :

>>> to_bool(True)
True
>>> to_bool("tRUe")
True
>>> to_bool("1")
True
>>> to_bool(1)
True
>>> to_bool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: 2
>>> to_bool([])
False
>>> to_bool({})
False
>>> to_bool(None)
False
>>> to_bool("Wasssaaaaa")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: Wasssaaaaa
>>>

하나는이 물려받을 수 : to_bool(["hello"])완벽하게 유효한 호출해야하는 경우 []지원됩니다
라파엘 T를

1
"예외 : 부울 변환에 유효하지 않은 값 : [ 'hello']"가 반환되고 문서화됩니다. 내 의견으로는 빈 목록은 분명히 거짓이지만 [ 'false']는 분명한 것이 아니므로 의도적으로 생략했습니다. 이것은 버그가 아닌 기능입니다. 원하는 경우 비어 있지 않은 목록에 대해 true를 반환하는 지원을 쉽게 추가 할 수 있어야합니다.
Petrucio

1
문서화해야합니다. 그러나 실제 생활에서는 결코 부르지 않을 것 to_bool([])입니다. 대신 그는 myList=someFunctionThatReturnAList`if (is_bool (myList)) : ... ' 행을 따라 무언가를 할 것이다 . 그래서리스트를 가지고 있고이리스트가 None인지 비어 있는지 알고 싶다.
Rafael T

>>> def a2b (arg) : ... default = bool (arg) ... isinstance (arg, str) 인 경우 : ... [ 'true', '에 arg.lower () 반환 t ','yes ','y ','1 '] ... else : ... 기본값 반환
ThePracticalOne

5
사소한 점 : 일반 예외보다 ValueError 를 선호해야합니다 .
dshepherd

10

당신은 항상 같은 것을 할 수 있습니다

myString = "false"
val = (myString == "true")

Parens의 비트는 False로 평가됩니다. 이것은 실제 함수 호출을 수행하지 않고 다른 방법입니다.


1
val = "false"이 예제 에서 선 은 무엇입니까 ? 왜 거기에 있습니까? 무슨 뜻이에요?
S.Lott 2016

9
나는 그것이 42를 의미한다고 생각합니다.
Geo

@Geo : 동의합니다; 그러나 그 진술에 의해 대답 된 질문은 무엇입니까?
S.Lott

이것은 내가 찾은 것, 파일에서 입력 필드를 평가하고 부울을 저장 한 결과를 기반으로합니다. 감사합니다.
jimh

9

@Alan Marchiori가 게시 한 내용을 기반으로하는 멋진 간단한 트릭이지만 yaml을 사용합니다.

import yaml

parsed = yaml.load("true")
print bool(parsed)

이 값이 너무 넓은 경우 형식 결과를 테스트하여 다듬을 수 있습니다. yaml-returned 유형이 str이면 다른 유형으로 캐스팅 할 수 없으므로 (어쨌든 생각할 수 있음) 개별적으로 처리하거나 사실로 만들 수 있습니다.

나는 빠른 속도로 추측하지는 않지만 어쨌든 Qt gui에서 yaml 데이터로 작업하고 있기 때문에 이것은 훌륭한 대칭을 가지고 있습니다.


1
yaml모듈은 타사 라이브러리입니다. PyYAML
Peter Wood

8

나는 너무 관대하기 때문에 여기의 해결책에 동의하지 않습니다. 이것은 일반적으로 문자열을 구문 분석 할 때 원하는 것이 아닙니다.

그래서 여기에 내가 사용하는 솔루션이 있습니다.

def to_bool(bool_str):
    """Parse the string and return the boolean value encoded or raise an exception"""
    if isinstance(bool_str, basestring) and bool_str: 
        if bool_str.lower() in ['true', 't', '1']: return True
        elif bool_str.lower() in ['false', 'f', '0']: return False

    #if here we couldn't parse it
    raise ValueError("%s is no recognized as a boolean value" % bool_str)

그리고 결과 :

>>> [to_bool(v) for v in ['true','t','1','F','FALSE','0']]
[True, True, True, False, False, False]
>>> to_bool("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in to_bool
ValueError: '' is no recognized as a boolean value

내 대답이 어떻게 든 누군가를 화나게 한 것처럼 보이기 때문에 분명히하십시오.

요점은 하나의 값만 테스트하고 다른 값은 가정하지 않는다는 것입니다. 나는 당신이 항상 구문 분석되지 않은 값에 모든 것을 매핑하고 싶지 않다고 생각합니다. 오류가 발생하기 쉬운 코드가 생성됩니다.

따라서 원하는 코드를 알고 있다면


2
나는 당신이 요점을 놓치고 있다고 생각합니다. 대답의 요점은 질문을 한 사람에게 어떻게 해야하는지 정확하게 말하지 말고 일반적인 원리를 설명하는 것이 었습니다. 원래 그 질문을 한 사람은 실제로 간단한 문제가 무엇인지 지나치게 생각하고있었습니다.
Keith Gaughan

8
@Keith 동의하지 않습니다. 요점은 질문에 따라 질문에 대답하고 있습니다.
estani

1
질문은 문자열을 부울로 변환하는 방법이었습니다. 그게 내가 대답 한 질문이었습니다. 원래 포스터에 유효한 부울 문자열이 무엇인지 알지 못합니다. 그렇기 때문에 포스터에 전체 답을 제공하는 것보다 일반적인 원칙을 보여주는 것이 더 중요합니다. 원래의 포스터는 모든 것을 설명 할 필요가 없었습니다. 필요한 것은 일반적인 원리를 보여주기위한 것이 었습니다. 그로부터 유능한 사람이 당신의 대답을 얻습니다.
Keith Gaughan

2
@dshepherd isinstance는 내가 기대하는 것을 파싱하고 있는지 확인하기 위해 있습니다. 문자열을 파싱하고 있으므로 우연히 '1'을 반환하는 car_race.lower () 메소드는 true를 반환해서는 안되며 ValueError를 발생시킵니다. 그러나 다른 경우에는 충분할 수 있습니다.
estani

2
@CivFan 재미있는 포인트. 나는 그것을 시도했지만 너무 나에게 읽지 않았다. elif는 반환 단어로 인해 중복되지만를 스캔하지 않고도 더 많은 정보를 제공합니다 return. 그러나 PEP 스타일 위반이있는 경우 저만입니다. 다른 제약이 없다면, 항상 가독성을 추구해야합니다 (그리고 표준은 그렇게합니다). 헤드 업과 흥미로운 의견에 감사드립니다!
estani

7

dict (실제로 defaultdict) 은이 트릭을 수행하는 매우 쉬운 방법을 제공합니다.

from collections import defaultdict
bool_mapping = defaultdict(bool) # Will give you False for non-found values
for val in ['True', 'yes', ...]:
    bool_mapping[val] = True

print(bool_mapping['True']) # True
print(bool_mapping['kitten']) # False

이 방법을 원하는 정확한 변환 동작에 맞게 조정하는 것은 정말 쉽습니다. 허용 된 Truthy 및 Falsy 값으로 채우고 값을 찾을 수 없을 때 예외를 발생 시키거나 None을 반환 할 수 있습니다. 또는 기본값은 False 또는 원하는 것입니다.


5

이미 해결책이 있지만 false, no 및 0 외에도 None, [], {} 및 ""을 포함하는 "standard"false 값을 사용하여 값을 부울 값으로 변환하는 방법을 찾고있는 다른 사용자 .

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems

1
세트를 사용하는 것이 좋으며, not in잘못된 항목을 선택하는 것은 다소 특이합니다.
SilentGhost

5

내장 함수 eval ()을 간단히 사용할 수 있습니다 .

a='True'
if a is True:
    print 'a is True, a type is', type(a)
else:
    print "a isn't True, a type is", type(a)
b = eval(a)
if b is True:
    print 'b is True, b type is', type(b)
else:
    print "b isn't True, b type is", type(b)

그리고 출력 :

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>

1
이것은 테스트 된 값이 유효한 파이썬 일 때만 작동합니다. "true"및 "false"는 예외를 발생시킵니다.
Gordon Bean

13
또한 eval이 문자열에서 임의의 코드를 실행하기 때문에 구문 분석에 'eval'을 사용하는 것은 실제로 나쁜 습관입니다. 어떤 상황에서는 이것이 큰 보안을 제공 할 수 있습니다.
Christopher Barber

7
이것은 정말 나쁜 대답입니다. 부울을 구문 분석하기 위해 임의의 표현식을 평가하는 것은 좋은 방법이 아닙니다.
augurar

5

또 다른 옵션

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

그러나 프로덕션 환경에서 모든 의존성과 의존성이 필요하지 않은 경우 소스 코드 를보고 필요한 로직의 일부를 복사 하는 것이 좋습니다 .


4

부울로 캐스팅에 대한 일반적인 규칙은 그 몇 가지 특별한 리터럴 ( False, 0, 0.0, (), [], {}) 거짓 내가 다음 사항을 권장하므로 다음 다른 모든 것이 사실입니다 :

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)

3

이것은 내가 쓴 버전입니다. 다른 여러 솔루션을 하나로 결합합니다.

def to_bool(value):
    """
    Converts 'something' to boolean. Raises exception if it gets a string it doesn't handle.
    Case is ignored for strings. These string values are handled:
      True: 'True', "1", "TRue", "yes", "y", "t"
      False: "", "0", "faLse", "no", "n", "f"
    Non-string values are passed to bool.
    """
    if type(value) == type(''):
        if value.lower() in ("yes", "y", "true",  "t", "1"):
            return True
        if value.lower() in ("no",  "n", "false", "f", "0", ""):
            return False
        raise Exception('Invalid value for boolean conversion: ' + value)
    return bool(value)

문자열을 얻으면 특정 값을 기대하고 그렇지 않으면 예외가 발생합니다. 문자열을 얻지 못하면 bool 생성자가 알아 내도록하십시오. 이러한 경우를 테스트했습니다.

test_cases = [
    ('true', True),
    ('t', True),
    ('yes', True),
    ('y', True),
    ('1', True),
    ('false', False),
    ('f', False),
    ('no', False),
    ('n', False),
    ('0', False),
    ('', False),
    (1, True),
    (0, False),
    (1.0, True),
    (0.0, False),
    ([], False),
    ({}, False),
    ((), False),
    ([1], True),
    ({1:2}, True),
    ((1,), True),
    (None, False),
    (object(), True),
    ]

strtype('')
pppery

3

입력 내용이 "True"또는 "False"인 경우 다음을 사용하지 마십시오.

def bool_convert(s):
    return s == "True"

실제로 if s else False비트 가 필요하지 않습니다 . 어떻게 "False" == "True"돌아올 지 생각해보십시오 False.
Taylor Edmiston 1

입력이 문자열인지 또는 이미 부울인지 확실하지 않은 경우을 추가 할 수 있습니다 if type(s) is bool: return s.
kontur

3

나는 사용한다

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""

2

나는 이것을 위해 삼항 연산자를 사용하고 싶습니다. 왜냐하면 1 줄을 넘지 않아야한다고 느끼는 것에 대해 간결합니다.

True if myString=="True" else False

1
my_string == 'True'보다 간결한 방법은 무엇입니까?
S. de Melo

2

나는 이것이 오래된 게시물이라는 것을 알고 있지만 일부 솔루션에는 약간의 코드가 필요합니다. 내가 사용한 결과는 다음과 같습니다.

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

7
이는 기능적으로 동일하고 더 복잡합니다. ( 'True', 'true')의 반환 값
Keith Gaughan


1

당신이 나를 좋아한다면 문자열 인 변수에서 부울이 필요합니다. @jzwiener가 앞서 언급 한 바와 같이 distils를 사용할 수 있습니다. 그러나 그가 제안한대로 모듈을 가져 와서 사용할 수 없었습니다.

대신 python3.7 에서이 방법으로 사용합니다.

파이썬에서 distutils 문자열을 부울

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distutils는 python std lib의 일부이므로 설치할 필요가 없습니다. 어느 것이 좋습니까! 👍


1

간단한 솔루션을 공유하고 싶습니다 eval(). 그것은 문자열로 변환합니다 TrueFalse문자열이 제목 형식으로 정확하게 경우 적절한 부울 종류를 TrueFalse 오류를 올릴 것이다 항상 첫 글자 자본이나 다른 기능.

예 :

>>> eval('False')
False

>>> eval('True')
True

물론 동적 변수의 경우을 사용 .title()하여 부울 문자열의 형식을 간단하게 지정할 수 있습니다 .

>>> x = 'true'
>>> eval(x.title())
True

오류가 발생합니다.

>>> eval('true')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined

0

여기에 같은 대답을 많이 얻을 수있는 털이 있습니다. 파이썬은 ""거짓이고 다른 모든 문자열은 참 이라고 생각하지만 TCL은 사물에 대해 매우 다른 생각을 가지고 있습니다.

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> var = Tkinter.BooleanVar(tk)
>>> var.set("false")
>>> var.get()
False
>>> var.set("1")
>>> var.get()
True
>>> var.set("[exec 'rm -r /']")
>>> var.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 324, in get
    return self._tk.getboolean(self._tk.globalgetvar(self._name))
_tkinter.TclError: 0expected boolean value but got "[exec 'rm -r /']"
>>> 

이것에 대한 좋은 점은 사용할 수있는 값을 상당히 용서한다는 것입니다. 문자열을 값으로 바꾸는 것이 게으르고, 받아들이고 거부하는 것에 대해 위생적입니다 (위의 진술이 tcl 프롬프트에서 주어지면 사용자 하드 디스크를 지우 게됩니다).

나쁜 점은 Tkinter를 사용할 수 있어야한다는 것인데, 일반적으로 사실은 아니지만 Tkinter를 사용할 수 있어야하며, 더 중요하게는 비교적 무거운 Tk 인스턴스를 만들어야합니다.

무엇 참 또는 거짓 고려하면의 행동에 따라 Tcl_GetBoolean고려, 0, false, nooff허위로하고 1, true, yeson 실제 사례를 구분합니다. 빈 문자열을 포함한 다른 문자열은 예외를 발생시킵니다.


0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

아이디어 : 문자열을 False로 평가할지 확인하십시오. 그렇지 않으면 bool ()은 비어 있지 않은 문자열에 대해 True를 반환합니다.


0

다음은 문자열의 진실성을 평가하기 위해 함께 던진 것입니다.

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

보다 eval안전하지만 사용하는 것과 거의 동일한 결과 .


0

방금이 작업을 수행해야 했으므로 파티에 늦었을 수도 있지만 누군가 유용 할 수 있습니다.

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default

0

당신이 돌아 오는 것 엔티티을 제어 할 수있는 경우 true/ false하나의 옵션은 반환하는 것입니다 1/ 0대신에 true/이 false다음 :

boolean_response = bool(int(response))

추가 캐스트 int는 항상 문자열 인 네트워크의 응답 을 처리합니다.


-5

파이썬의 내장 eval()함수를 사용하여.capitalize() 메소드를 사용하면 "true"/ "false"문자열 (처음 대문자와 상관없이)을 실제 Python 부울로 변환 할 수 있습니다.

예를 들면 다음과 같습니다.

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>

4
문자열에 포함되어 있으면 어떻게됩니까 #\nshutil.rmtree('/someImportantDirectory')? (시도하지 마십시오!)
mastov

@mastov-말도 안되는 downvote. 들어오는 문자열을 제어 할 수없는 경우 코드와 마찬가지로 예방 조치를 취해야합니다. 그러나 워크 플로를 제어하면 간단한 솔루션입니다. 모든면에서 완벽하지 않은 솔루션을 오답으로 혼동하지 마십시오.
elPastor

1
위험을 언급하지 않는 것 외에도 (이것은 이미 나쁜 대답이됩니다) : 사전에 입력을 위생 처리 할 것을 제안하고 있습니까? 그것은이 방법의 단순성을 죽일 것입니다.이 방법은 주요 장점이었습니다.
mastov

4
eval이 간단한 것을 사용 하는 것은 단지 취약점을 요구 합니다.
mastov

1
모든 코드가 아닙니다. 그러나 다른 유형 변환 문자열은 일반적으로 특히 코드 있다는 것이다 당신의 통제가 부족합니다. 종종 당신은 그것을 깨닫지 못할 수도 있습니다. "내 데이터베이스 (또는 구성 파일)이며 시스템의 일부인 내 통제하에 있습니다." 그런 다음 다음과 같은 이유로 데이터베이스에 대한 다른 모듈 액세스 권한을 부여합니다. "해가 무엇입니까? 문자열이있는 일부 테이블뿐입니다." 그러나 eval이러한 문자열을 사용하면 누군가가 전체 시스템을 인수하는 데 도움이 될 수 있습니다.
mastov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.