2011-05-15 2 views
0

PHP의 @과 동일한 Python이 있습니까?PHP와 동일한 Python @

@function_which_is_doomed_to_fail(); 

난 항상이 블록 사용했습니다 :

try: 
    foo() 
except: 
    pass 

을하지만 거기에있다이 더 좋은 방법을 알고 .

누군가 Pythonicify 코드를 어떻게 알 수 있습니까?


는 그 코드에 어떤 컨텍스트를 추가하는 것이 적절하다고 생각 : 당신이 찾고있는 것은 안티 - 파이썬입니다

for line in blkid: 
    line = line.strip() 
    partition = Partition() 

    try: 
    partition.identifier = re.search(r'^(/dev/[a-zA-Z0-9]+)', line).group(0) 
    except: 
    pass 

    try: 
    partition.label = re.search(r'LABEL="((?:[^"\\]|\\.)*)"', line).group(1) 
    except: 
    pass 

    try: 
    partition.uuid = re.search(r'UUID="((?:[^"\\]|\\.)*)"', line).group(1) 
    except: 
    pass 

    try: 
    partition.type = re.search(r'TYPE="((?:[^"\\]|\\.)*)"', line).group(1) 
    except: 
    pass 

    partitions.add(partition) 

답변

1

건물과 당신의 욕망 : 명명 관련 그룹은 쉽게 그룹 인덱싱 버그를 방지 할 수

def cond_match(regexp, line, grp): 
    match = re.search(regexp, line) 
    if match: 
     return match.group(grp) 
    else: 
     return None 

for line in blkid: 
    line = line.strip() 
    partition = Partition() 
    partition.identifier = cond_match(r'^(/dev/[a-zA-Z0-9]+)', line, 0) 
    partition.label = cond_match(r'LABEL="((?:[^"\\]|\\.)*)"', line, 1) 
    partition.uuid = cond_match(r'UUID="((?:[^"\\]|\\.)*)"', line, 1) 
    partition.type = cond_match(r'TYPE="((?:[^"\\]|\\.)*)"', line, 1) 
    partitions.add(partition) 
+0

글쎄, 그건 내가 짐작할 수있는만큼 좋은 것 같아. 감사! – Blender

5

, 이유는

파이썬의 선에 의해 Tim Peters
미인보다 낫습니다.
암시 적 암시 적보다 낫습니다.
단순함이 복잡한 것보다 낫습니다.
복잡한 것은 복잡한 것보다 낫습니다.
평면이 중첩 된 것보다 낫습니다.
스파 스가 밀도보다 좋습니다.
가독성이 계산됩니다.
특별한 경우는 규칙을 위반하기에 충분하지 않습니다.
실용성이 순결하지만.
오류가 자동으로 전달되지 않아야합니다.
명시 적으로 음소거되어 있지 않는 한.
모호한 점에서 추측하려는 유혹을 거부하십시오.
하나의 - 그리고 바람직하게는 단지 하나의 - 명백한 방법이 있어야합니다.
네덜란드 사람이 아닌 이상 그런 식으로는 처음에는 분명하지 않을 수도 있습니다.
이제는 절대로 좋지 않습니다.
오른쪽, 이상인 경우는 없습니다.
구현을 설명하기가 어렵다면 좋지 않은 생각입니다.
구현이 설명하기 쉬운 경우 좋은 생각 일 수 있습니다.
네임 스페이스는 훌륭한 아이디어를 제공합니다. 귀하의 경우에는

, 내가 이런 걸 사용합니다 :

match = re.search(r'^(/dev/[a-zA-Z0-9]+)', line) 
if match: 
    partition.identifier = match.group(0) 

을 그리고 당신은 더 좋은 방법이 있습니다 대신 4

+0

내 편집을 참조하십시오. 어쩌면 당신은 내 문제에 대한 더 나은 해결책이 있는지 알 수 있습니다. – Blender

+0

편집 해 주셔서 감사합니다. 어떤 방법으로 그것을 하나로 응축시킬 수 있습니까? – Blender

+0

'partition.identifier = getattr (re.search (r '^ (/ dev/[a-zA-Z0-9] +)', 줄), '그룹', [없음] [0]' – Imran

2

의 3 개 라인을 가지고있다. 오류를 자동으로 무시하는 것은 모든 언어에서 나쁜 습관이므로 자연스럽게 Pythonic이 아닙니다.

당신은 아마이 그룹을 취득하기 전에하지 None 있는지 확인하려면 : http://docs.python.org/library/warnings.html

편집 후 -

0

파이썬에서 경고 제어가있다. 또한 그룹에 len()을 사용하여 가지고있는 그룹의 수를 확인하십시오. . "패스"오류가 확실히가는 길은 아닙니다.

+0

나 ' d는 'not none'을 참조하고 확인하기 위해 어떻게 든 변수를 캐쉬해야하고'.group()'을 사용해야한다. 그래서 이것은 코드 길이에 도움이되지 않을 것이다. – Blender

+0

그룹의 수는 정규 표현식에 의존하기 때문에'len()'이 필요 없습니다. 표현식에 그룹이 없거나 숫자가 없습니다. –

+0

@Gabi Purcaru - point taken – manojlds

1

파이썬이 PHP와 같은 것으로 요구하지 마십시오. 할 수있는 가장 구체적인 오류는 항상 명시 적으로 트랩해야합니다. 그런 모든 오류를 잡아 내고 무시하는 것은 좋은 모범 사례가 아닙니다. 이는 다른 문제를 숨기고 버그를 찾기 어렵게 만들기 때문입니다. 그러나 RE의 경우에는 반환하는 None 값을 실제로 확인해야합니다. 예를 들어, 코드 :이 일치하지 않을 경우 일치가없는 경우 re.search 반환 없음 때문에

label = re.search(r'LABEL="((?:[^"\\]|\.)*)"', line).group(1) 

는 AttributeError를 발생시킵니다. 그러나 경우가 일치했지만, 당신은 당신의 코드에서 오타했다 : 일치가 있었다하더라도,

label = re.search(r'LABEL="((?:[^"\\]|\.)*)"', line).roup(1) 

이것은 또한 AttributeError를 제기합니다. 하지만 catchall 예외를 사용하고 그것을 무시하면 그 오류를 숨길 수 있습니다. 이 경우 레이블을 일치시키지 않을 것이고, 다른 방법으로 찾을 때까지는 알 수 없을 것입니다. 예를 들어, 코드가 레이블과 일치하지 않는다는 것을 알아 차리는 것 (그러나이 경우에는 단위 테스트가있는 것이 좋을 것입니다 ...) RE가 들어

는 일반적인 패턴은 이것이다 :

matchobj = re.search(r'LABEL="((?:[^"\\]|\.)*)"', line) 
if matchobj: 
    label = matchobj.group(1) 

시도하고 일을 없을 것이기 때문에 여기에 예외를 잡을 필요가 없습니다. 예외 ... 비슷한 오타로 인한 예외가있는 경우를 제외하고

+0

맞아요. 파이썬에 변수를 설정하고 동시에 if (i = 0)와 (i> foo)와 같은지 검사하는 방법이 있다면 이것을 사용합니다. 가독성에 대해 더 걱정 스럽지만이 솔루션은 짧기 때문에 지금은 사용하겠습니다. 감사! – Blender

+0

감사합니다. 하지만 파이썬에는 가독성을위한 기능이 없을 수도 있습니다. ;-)이 언어는 오류가있는 일반적인 소스이기도합니다. – Keith

+0

오 잘. 나는 지금 2 라인으로 충분하다고 생각합니다. 내가 무엇을 할 수 있는지 알아볼 게. – Blender

1

반복하지 말고 데이터 기반 디자인을 사용하십시오. 당신이 함수에 자신의 솔루션을 캡슐화하고 예를 줄일 수, 한 - 라이너에 응축 가비 Purcanu의 대답에 따라

_components = dict(
    identifier = re.compile(r'^(?P<value>/dev/[a-zA-Z0-9]+)'), 
    label = re.compile(r'LABEL="(?P<value>(?:[^"\\]|\\.)*)"'), 
    uuid = re.compile(r'UUID="(?P<value>(?:[^"\\]|\\.)*)"'), 
    type = re.compile(r'TYPE="(?P<value>(?:[^"\\]|\\.)*)"'), 
) 

for line in blkid: 
    line = line.strip() 
    partition = Partition() 

    for name, pattern in _components: 
     match = pattern.search(line) 
     value = match.group('value') if match else None 
     setattr(partition, name, value) 

    partitions.add(partition)