코드 최적화

코드 최적화

아래에는 내 코드(내가 만든 메서드)의 일부가 표시되며, 가독성을 높이고 더 아름답게 만들 수 있는 제안 사항이 있는지 묻고 싶습니다.

그래서 제가 한 일은 엑셀 파일을 읽고 그 내용을 바탕으로 한 것이었습니다.전시하다열은 데이터베이스에서 일부 쿼리를 실행했습니다. 하지만 제 문제는 삼항 연산자에 있습니다. 이 연산자는 많이 사용되고 끔찍해 보입니다.

def add_new_patient_identifier(self, excel_file, sheet):

    patient_identifiers = self.excel_reader.read_excel_sheet(excel_file, sheet)
    header = self.excel_reader.get_header(patient_identifiers)

    self.openmrsclient_db.execute("DELETE FROM  idgen_identifier_source")
    self.openmrsclient_db.execute("DELETE FROM  idgen_seq_id_gen")

    for identifier in patient_identifiers.iter_rows(min_row=2):
        if identifier[header['Display']].value == "Yes":

            field = str(identifier[header['Field']].value) if str(identifier[header['Field']].value) != 'None' else ''
            description = str(identifier[header['Source Description']].value) if str(identifier[header['Source Description']].value) != 'None' else ''
            next_sequence_value = str(identifier[header['Next Sequence Value']].value) if str(identifier[header['Next Sequence Value']].value) != 'None' else ''
            base_character_set = str(identifier[header['Base Character Set']].value) if str(identifier[header['Base Character Set']].value) != 'None' else ''
            first_identifier_base = str(identifier[header['First Identifier Base']].value) if str(identifier[header['First Identifier Base']].value) != 'None' else ''
            suffix = str(identifier[header['Suffix']].value) if str(identifier[header['Suffix']].value) != 'None' else ''
            min_length = str(identifier[header['Min Length']].value) if str(identifier[header['Min Length']].value) != 'None' else ''
            max_length = str(identifier[header['Max Length']].value) if str(identifier[header['Max Length']].value) != 'None' else ''
            type_identifier = str(identifier[header['Type']].value) if str(identifier[header['Type']].value) != 'None' else ''

            identifier_type_id = str(self.openmrsclient_db.fetch(
                "SELECT patient_identifier_type_id FROM patient_identifier_type WHERE name = '" + type_identifier + "'")[0][0])

            self.openmrsclient_db.execute("INSERT INTO idgen_identifier_source (uuid, name, description, identifier_type, date_created, creator) \
                            VALUES (uuid(),'" + field + "', '" + description + "', '" + identifier_type_id + "', now(), '1')")

            identifier_source_id = str(self.openmrsclient_db.fetch("SELECT id FROM idgen_identifier_source WHERE name = '" + field + "'")[0][0])

            self.openmrsclient_db.execute("INSERT INTO idgen_seq_id_gen (id, next_sequence_value, base_character_set, first_identifier_base, prefix, suffix, min_length, max_length) \
                            VALUES (" + identifier_source_id + "," + next_sequence_value + "," + base_character_set+","+first_identifier_base+",'" +
                                          field+"','"+suffix+"'," + min_length + "," + max_length + ")")

답변1

우선, 두 번 변환하지 마십시오.

field = str(identifier[header['Field']].value)
field = '' if field == 'None' else field

이 삼항 합계 접근자를 별도의 함수에 넣을 수 있습니다.

def load(identifier, header, field):
    val = str(identifier[header[field]].value)
    rval = '' if val == 'None' else rval

field = load(identifier, header, 'Field')
description = load(identifier, header, 'Source Description')

등.

또한 해당 SQL 문과 관련하여 현재 수행 중인 작업은 SQL 주입에 적합합니다. openmrsclient_db가 준비된 명령문을 지원한다면 이를 사용하는 것이 좋습니다.

예를 들어 누군가가 "max_length"에 대해 "0); DROP TABLE idgen_seq_id_gen"을 입력하면 데이터베이스가 테이블을 삭제할 수 있습니다. 나는 openmrsclient_db를 사용한 적이 없다는 것을 인정하지만, 삭제되지 않은 입력과 함께 사용할 경우 SQL 주입에 취약할 수 있습니다.

답변2

그래서 변수만 가지고는 이렇게 했습니다(지금은 쿼리가 우선순위가 아니기 때문에)

def add_new_patient_identifier(self, excel_file, sheet):

    patient_identifiers = self.excel_reader.read_excel_sheet(excel_file, sheet)
    header = self.excel_reader.get_header(patient_identifiers)

    self.openmrsclient_db.execute("DELETE FROM  idgen_identifier_source")
    self.openmrsclient_db.execute("DELETE FROM  idgen_seq_id_gen")

    for identifier in patient_identifiers.iter_rows(min_row=2):
        if self.load(identifier, header, 'Display') == "Yes":

            field = self.load(identifier, header, 'Field')
            description = self.load(identifier, header, 'Source Description')
            next_sequence_value = self.load(identifier, header, 'Next Sequence Value')
            base_character_set = self.load(identifier, header, 'Base Character Set')
            first_identifier_base = self.load(identifier, header, 'First Identifier Base')
            suffix = self.load(identifier, header, 'Suffix')
            min_length = self.load(identifier, header, 'Min Length')
            max_length = self.load(identifier, header, 'Max Length')
            type_identifier = self.load(identifier, header, 'Type')


def load(self, key, header, field):
        original_cell_value = key[header[field]].value
        cell_value = '' if original_cell_value == 'None' else original_cell_value
        return str(cell_value)

관련 정보