일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 컴퓨터공학
- 프로그래밍언어
- 프로그래밍
- 데이터과학
- 보안
- 컴퓨터과학
- 소프트웨어공학
- 소프트웨어
- 알고리즘
- 딥러닝
- 머신러닝
- 코딩
- 데이터베이스
- 빅데이터
- 웹개발
- 자바스크립트
- 2
- 파이썬
- Yes
- I'm Sorry
- 자료구조
- 컴퓨터비전
- 네트워크
- 데이터분석
- 버전관리
- 네트워크보안
- 데이터구조
- 사이버보안
- 클라우드컴퓨팅
- 인공지능
- Today
- Total
스택큐힙리스트
네임드 튜플과 선택적 키워드 인수에 대한 기본값 본문
저는 긴 데이터 클래스를 이름 있는 튜플로 변환하려고 노력하고 있습니다. 현재 제 클래스는 다음과 같이 보입니다.
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과 선택적 키워드 인수에 대한 이점은 개발자에게 유용하며, 코드를 더욱 개선하는 데 필수적입니다. 이를 통해 개발자는 더욱 효율적으로 코드를 작성하고 유지 관리할 수 있습니다.