복붙노트

[PYTHON] 목록 또는 단일 정수를 인수로 처리하십시오.

PYTHON

목록 또는 단일 정수를 인수로 처리하십시오.

함수는 행 이름 (이 경우 2 열)을 기반으로 테이블의 행을 선택해야합니다. 인수로 단일 이름 또는 이름 목록을 취하여 올바르게 처리 할 수 ​​있어야합니다.

이것은 내가 지금 가지고있는 것이지만 이상적으로는 중복 된 코드가 존재하지 않을 것이고 예외가 입력 인수를 처리하는 올바른 방법을 선택하는 데 지능적으로 사용될 것입니다.

def select_rows(to_select):
    # For a list
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in to_select:
            table.selectRow(row)
    # For a single integer
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() == to_select:
            table.selectRow(row)

해결법

  1. ==============================

    1.사실 Andrew Hare의 답변에 동의합니다. 단 하나의 요소로 목록을 전달하십시오.

    사실 Andrew Hare의 답변에 동의합니다. 단 하나의 요소로 목록을 전달하십시오.

    그러나 실제로 비 목록을 받아 들여야한다면, 그 경우 목록으로 바꾸는 것이 어떻습니까?

    def select_rows(to_select):
        if type(to_select) is not list: to_select = [ to_select ]
    
        for row in range(0, table.numRows()):
            if _table.item(row, 1).text() in to_select:
                table.selectRow(row)
    

    단일 항목 목록에서 'in'을 수행하면 성능이 저하 될 수 있습니다. 하지만 'to_select'목록이 길면 고려해야 할 또 다른 사항을 지적합니다. 조회를보다 효율적으로 수행 할 수 있도록 세트로 캐스팅하는 것이 좋습니다.

    def select_rows(to_select):
        if type(to_select) is list: to_select = set( to_select )
        elif type(to_select) is not set: to_select = set( [to_select] )
    
        for row in range(0, table.numRows()):
            if _table.item(row, 1).text() in to_select:
                table.selectRow(row)
    
  2. ==============================

    2.다음과 같이 여러 가지 인수를 취하도록 함수를 재정의 할 수 있습니다.

    다음과 같이 여러 가지 인수를 취하도록 함수를 재정의 할 수 있습니다.

    def select_rows(*arguments):
        for row in range(0, table.numRows()):
            if _table.item(row, 1).text() in arguments:
                table.selectRow(row)
    

    다음과 같이 하나의 인수를 전달할 수 있습니다.

    select_rows('abc')
    

    다음과 같은 여러 인수가 있습니다.

    select_rows('abc', 'def')
    

    이미 목록이있는 경우 :

    items = ['abc', 'def']
    select_rows(*items)
    
  3. ==============================

    3.나는 이것을 단지 할 것이다 :

    나는 이것을 단지 할 것이다 :

    def select_rows(to_select):
        # For a list
        for row in range(0, table.numRows()):
            if _table.item(row, 1).text() in to_select:
                table.selectRow(row)
    

    인수는 항상 하나의 요소 목록 일지라도 항상 목록이 될 것으로 기대합니다.

    생각해 내다:

  4. ==============================

    4.나는 Sharkey의 버전과 함께 가고 싶지만 조금 더 많은 타이 타이핑을 사용한다 :

    나는 Sharkey의 버전과 함께 가고 싶지만 조금 더 많은 타이 타이핑을 사용한다 :

    def select_rows(to_select):
        try:
            len(to_select)
        except TypeError:
            to_select = [to_select]
    
        for row in range(0, table.numRows()):
            if _table.item(row, 1).text() in to_select:
                table.selectRow(row)
    

    이것은 in 연산자를 지원하는 모든 객체로 작업 할 때 이점이 있습니다. 또한 이전 버전에서는 튜플이나 다른 시퀀스가 ​​있으면 목록으로 감쌀 것입니다. 단점은 예외 처리 사용에 약간의 성능 저하가 있다는 것입니다.

  5. from https://stackoverflow.com/questions/998938/handle-either-a-list-or-single-integer-as-an-argument by cc-by-sa and MIT license