Python : 한 줄의 try 문
파이썬에서 try / except를 한 줄로 바꾸는 방법이 있습니까?
뭔가 ...
b = 'some variable'
a = c | b #try statement goes here
어디에서 b
선언 된 변수이고 c
그래서 ...없는 c
오류가 발생 것이고 a
이 될 것입니다 b
...
파이썬에서 try
/ except
블록을 한 줄로 압축하는 방법은 없습니다 .
또한 다른 동적 언어 에서처럼 변수가 Python에 존재하는지 여부를 알지 못하는 것은 나쁜 일입니다. 더 안전한 방법 (그리고 일반적인 스타일)은 모든 변수를 무언가로 설정하는 것입니다. 그들이 설정되지 수있는 경우로 설정 None
첫 번째 (또는 0
또는 ''
또는 더 적용 할 경우 뭔가.)
당신이 경우 어떻게 처음에 관심이있는 모든 이름을 할당, 당신은 옵션이 없습니다.
가장 좋은 방법은 if 문입니다.
c = None b = [1, 2] if c is None: a = b else: a = c
한 줄 옵션은 조건식입니다.
c = None b = [1, 2] a = c if c is not None else b
일부 사람들
or
은이 를 위해 단락 동작을 남용합니다 . 이것은 오류가 발생하기 쉬우 므로 절대 사용하지 않습니다.c = None b = [1, 2] a = c or b
다음 경우를 고려하십시오.
c = [] b = [1, 2] a = c or b
이 경우,
a
아마 해야 할[]
, 그러나 그것은이다[1, 2]
때문에[]
부울 컨텍스트에서 false입니다. 거짓 일 수있는 값이 많기 때문에 나는or
트릭을 사용하지 않습니다 . (이것은 사람들이if foo:
의미 할 때 말하는 것과 같은 문제if foo is not None:
입니다.)
이것은 끔찍한 해킹이지만 디버깅을 위해 일련의 작업을 작성하고 싶을 때 프롬프트에서 사용했습니다.
exec "try: some_problematic_thing()\nexcept: problem=sys.exc_info()"
print "The problem is %s" % problem[1]
대부분의 경우 한 줄 시도 제외 제한에 전혀 신경 쓰지 않지만 실험 중일 때 readline이 대화 형 인터프리터에서 한 번에 전체 코드 덩어리를 호출하도록하고 싶습니다. 이 작은 트릭이 유용합니다.
달성하려는 실제 목적을 위해 시도해 볼 수 있습니다 locals().get('c', b)
. 이상적으로는 로컬 컨텍스트 대신 실제 사전을 사용하거나 설정하거나 설정하지 않을 수있는 모든 것을 실행하기 전에 c를 None에 할당하는 것이 좋습니다.
또 다른 방법은 컨텍스트 관리자를 정의하는 것입니다.
class trialContextManager:
def __enter__(self): pass
def __exit__(self, *args): return True
trial = trialContextManager()
그런 다음 with
문을 사용하여 한 줄의 오류를 무시합니다.
>>> with trial: a = 5 # will be executed normally
>>> with trial: a = 1 / 0 # will be not executed and no exception is raised
>>> print a
5
런타임 오류의 경우 예외가 발생하지 않습니다. 그것은처럼 try:
포함하지 않는 except:
.
python3에서는 contextlib.suppress 를 사용할 수 있습니다 .
from contextlib import suppress
d = {}
with suppress(KeyError): d['foo']
parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x)
항상 해결책이 있습니다.
다음을 사용하여 네임 스페이스 딕셔너리에 액세스하여 그것을 할 수 있습니다 vars()
, locals()
또는 globals()
상황에 가장 적합한 중.
>>> b = 'some variable'
>>> a = vars().get('c', b)
문제는 실제로 내가 테스트하려는 django model.objects.get 쿼리라는 것입니다. .get은 데이터가 없으면 오류를 반환합니다 ... None을 반환하지 않습니다 (나를 짜증나게합니다)
다음과 같이 사용하십시오.
print("result:", try_or(lambda: model.objects.get(), '<n/a>'))
여기서 try_or는 사용자가 정의한 유틸리티 함수입니다.
def try_or(fn, default):
try:
return fn()
except:
return default
선택적으로 당신에게 허용 예외 유형을 제한 할 수 있습니다 NameError
, AttributeError
등
장고를 사용하고 있다고 언급하셨습니다. 당신이하고있는 일에 의미가 있다면 다음을 사용할 수 있습니다.
my_instance, created = MyModel.objects.get_or_create()
created
True 또는 False입니다. 아마도 이것이 당신을 도울 것입니다.
실제로 예외를 관리해야하는 경우 :
(poke53280의 답변에서 수정 됨)
>>> def try_or(fn, exceptions: dict = {}):
try:
return fn()
except Exception as ei:
for e in ei.__class__.__mro__[:-1]:
if e in exceptions: return exceptions[e]()
else:
raise
>>> def context():
return 1 + None
>>> try_or( context, {TypeError: lambda: print('TypeError exception')} )
TypeError exception
>>>
note that if the exception is not supported, it will raise as expected:
>>> try_or( context, {ValueError: lambda: print('ValueError exception')} )
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
try_or( context, {ValueError: lambda: print('ValueError exception')} )
File "<pyshell#38>", line 3, in try_or
return fn()
File "<pyshell#56>", line 2, in context
return 1 + None
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
>>>
also if Exception
is given, it will match anything below.
(BaseException
is higher, so it will not match)
>>> try_or( context, {Exception: lambda: print('exception')} )
exception
Version of poke53280 answer with limited expected exceptions.
def try_or(func, default=None, expected_exc=(Exception,)):
try:
return func()
except expected_exc:
return default
and it could be used as
In [2]: try_or(lambda: 1/2, default=float('nan'))
Out[2]: 0.5
In [3]: try_or(lambda: 1/0, default=float('nan'), expected_exc=(ArithmeticError,))
Out[3]: nan
In [4]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError,))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
[your traceback here]
TypeError: unsupported operand type(s) for /: 'str' and 'int'
In [5]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError, TypeError))
Out[5]: nan
참고URL : https://stackoverflow.com/questions/2524853/python-try-statement-in-a-single-line
'Programing' 카테고리의 다른 글
IntelliJ Idea에서 편집기 테마를 설정하는 방법 (0) | 2020.11.17 |
---|---|
Visual Studio 2008에서 디버깅 할 기본 브라우저를 변경하는 방법은 무엇입니까? (0) | 2020.11.17 |
Spring MVC 컨트롤러의 보안 컨텍스트에서 UserDetails 객체 가져 오기 (0) | 2020.11.17 |
nodejs-http.createServer가 두 번 호출하는 것 같습니다. (0) | 2020.11.17 |
PHP는 명령 줄에서 입력을 기다립니다. (0) | 2020.11.17 |