스택큐힙리스트

네임드 튜플과 선택적 키워드 인수에 대한 기본값 본문

카테고리 없음

네임드 튜플과 선택적 키워드 인수에 대한 기본값

스택큐힙리스트 2023. 4. 16. 15:02
반응형

저는 긴 데이터 클래스를 이름 있는 튜플로 변환하려고 노력하고 있습니다. 현재 제 클래스는 다음과 같이 보입니다.

class Node(object):

def __init__(self, val, left=None, right=None):

self.val = val

self.left = left

self.right = right

namedtuple 으로 변환하면 다음과 같습니다.

from collections import namedtuple

Node = namedtuple('Node', 'val left right')

하지만 여기에 문제가 있습니다. 내 원래 클래스는 값만 전달하면 이름이 지정된/키워드 인수의 기본값을 사용하여 기본값을 처리했습니다. 이와 같은 것:

class BinaryTree(object):

def __init__(self, val):

self.root = Node(val)

그러나 내가 리팩터링한 네임드 튜플의 경우 이것이 모든 필드를 전달하도록 요구하기 때문에 이것은 작동하지 않습니다. 물론 Node(val)의 발생을 Node(val, None, None) 로 대체할 수 있지만, 내 기호에는 맞지 않습니다.

내 재작성을 성공시킬 좋은 꼼수가 있는 건가요? (메타프로그래밍과 같은) 많은 코드 복잡성을 추가하지 않고도. 아니면 그냥 검색하고 교체를 하라는 조언을 따라야 할까요? :)

답변 1

파이썬 3.7

기본값 매개변수를 사용하세요.

>>> from collections import namedtuple

>>> fields = ('val', 'left', 'right')

>>> Node = namedtuple('Node', fields, defaults=(None,) * len(fields))

>>> Node()

Node(val=None, left=None, right=None)

혹은 더 좋은 것은 namedtuple보다 훨씬 좋은 새로운 dataclasses 라이브러리를 사용하세요.

>>> from dataclasses import dataclass

>>> from typing import Any

>>> @dataclass

... class Node:

... val: Any = None

... left: 'Node' = None

... right: 'Node' = None

>>> Node()

Node(val=None, left=None, right=None)

파이썬 3.7 이전에

기본값으로 Node.__new__.__defaults__을 설정하십시오.

>>> from collections import namedtuple

>>> Node = namedtuple('Node', 'val left right')

>>> Node.__new__.__defaults__ = (None,) * len(Node._fields)

>>> Node()

Node(val=None, left=None, right=None)

파이썬 2.6 이전에는

기본값으로 Node.__new__.func_defaults을 설정합니다.

>>> from collections import namedtuple

>>> Node = namedtuple('Node', 'val left right')

>>> Node.__new__.func_defaults = (None,) * len(Node._fields)

>>> Node()

Node(val=None, left=None, right=None)

주문하세요

파이썬의 모든 버전에서 namedtuple에 존재하는 값보다 적은 기본값을 설정하면, 기본값은 가장 오른쪽 인자에 적용됩니다. 이를 통해 필수 인자로 몇 가지 인수를 유지할 수 있습니다.

>>> Node.__new__.__defaults__ = (1,2)

>>> Node()

Traceback (most recent call last):

...

TypeError: __new__() missing 1 required positional argument: 'val'

>>> Node(3)

Node(val=3, left=1, right=2)

파이썬 2.6에서 3.6로의 래퍼(wrapper)

여기 래퍼가 있습니다. 선택적으로 기본값을 None이 아닌 다른 값으로 설정할 수 있습니다. 이는 필수 인수를 지원하지 않습니다.

import collections

def namedtuple_with_defaults(typename, field_names, default_values=()):

T = collections.namedtuple(typename, field_names)

T.__new__.__defaults__ = (None,) * len(T._fields)

if isinstance(default_values, collections.Mapping):

prototype = T(**default_values)

else:

prototype = T(*default_values)

T.__new__.__defaults__ = tuple(prototype)

return T

Hello - 안녕하세요

>>> Node = namedtuple_with_defaults('Node', 'val left right')

>>> Node()

Node(val=None, left=None, right=None)

>>> Node = namedtuple_with_defaults('Node', 'val left right', [1, 2, 3])

>>> Node()

Node(val=1, left=2, right=3)

>>> Node = namedtuple_with_defaults('Node', 'val left right', {'right':7})

>>> Node()

Node(val=None, left=None, right=7)

>>> Node(4)

Node(val=4, left=None, right=7)

답변 2

주제: Named tuple과 선택적 키워드 인수의 기본값

Named tuple은 파이썬에서 매우 유용한 데이터 구조 중 하나입니다. 이 구조는 속성 이름으로 요소를 참조할 수 있으며, 일반적인 튜플에 비해 더욱 가독성이 높습니다. 선택적 키워드 인수의 기본값은 코드를 간결하고 가독성 있는 코드로 만드는 데 도움이 됩니다.

Named tuple을 사용하면 코드 작성 시 문제가 생겼을 때 에러가 발생하는 것을 예방할 수 있습니다. named tuple에서 속성 이름을 확인할 필요가 없으므로 함수 호출에 대한 실수를 줄일 수 있습니다. 이는 코드 작성 과정에서 발생할 수 있는 버그를 예방하는 데 유용합니다.

또한 선택적 키워드 인수에 기본값을 설정하면 코드를 더욱 간결하게 만들 수 있습니다. 이를 통해 매개변수를 전달할 때 매번 값을 설정하지 않아도 되므로 코드의 길이를 줄이고 실행 시간을 단축시킬 수 있습니다. 이러한 접근 방식은 함수의 인수에 대한 이해를 높이고 코드를 더욱 가독성 있게 만듭니다.

이러한 이점을 활용하면 named tuple과 선택적 키워드 인수를 효과적으로 활용할 수 있습니다. named tuple과 선택적 키워드 인수를 사용하면 코드 작성 및 유지 관리가 더욱 쉬워지며, 코드의 가독성과 실행 시간을 개선할 수 있습니다.

주어진 문제를 해결하려면, named tuple을 정의하고 선택적 키워드 인수에 기본값을 설정하는 코드를 작성해야합니다. 이를 통해 코드 구조를 개선하고 유지 관리 용이성을 높일 수 있습니다. 또한, 코드 실행 시간을 단축시켜 개발자는 기능 개발에 좀 더 집중할 수 있습니다.

이러한 named tuple과 선택적 키워드 인수에 대한 이점은 개발자에게 유용하며, 코드를 더욱 개선하는 데 필수적입니다. 이를 통해 개발자는 더욱 효율적으로 코드를 작성하고 유지 관리할 수 있습니다.

반응형
Comments