| CARVIEW |
Python 3.15?Œlj??????frozendict?N???X??sentinel?N???X???Ăǂ?Ȃ??́H?FHP???킳???̌????m?[?g
Python 3.15?ł͑g?ݍ??^?Ƃ??ĕύX?s?\?Ȏ????ł???frozendict?N???X?ƁA?l????????Ȃ????Ƃ?g???Ȃ????Ƃ??Ӗ?????ԕ??l??\??sentinel?N???X???lj??????\??ł??B???????ǂ?Ȃӂ??Ɏg???̂??A??????ƒ??ׂĂ݂܂????B
???̋L???͉??????ł??B????o?^?i?????j????ƑS?Ă????????????܂??B
?@?ǂ???HP???킳???ł??B
?@Python?ɂ͕ύX?\?ȏW????\??set?N???X?ƕύX?s?\?ȏW????\??frozenset?N???X??????܂????B????frozenset?N???X?̎????łƂ???????̂?frozendict?N???X?ł??i?z???g???ȁH?j?B?????āA?R???e?i?I?u?W?F?N?g???牽????T??????A?^????ꂽ?????̒l???`?F?b?N?????肷??ۂ̔ԕ??l??\?????߂̐V???ȑg?ݍ??^?Ƃ???sentinel?N???X???o?ꂵ?܂??B?????ɂ??āA?ȉ??ł͂?????Ǝ????Ă݂邱?Ƃɂ??܂??傤?B
Python 3.15?Œlj??????2?̑g?ݍ??^
?@Python 3.15?ł͎???2?̑g?ݍ??^???lj??????\??ł??B
- frozendict?N???X?iPEP 814?j
- sentinel?N???X?iPEP 661?j
?@frozendict?N???X?͗v?f?̕ύX??lj????ł??Ȃ??????i?}?b?s???O?^?j?ł??B?ʏ?̎????idict?N???X?j?͕ύX?\?ȃI?u?W?F?N?g?ł???A?n?b?V???s?\?ł?????܂??B?܂?A???????W???̗v?f?ɂ?????A?ʂ̎????̃L?[?Ƃ??Ďg?????肷?邱?Ƃ͂ł??܂???B???????Afrozendict?I?u?W?F?N?g?Ȃ?A?W???̗v?f?ɂ?????A???̎????̃L?[?ɂ?????ł??܂??i???????A???̒l?????X?g?̂悤?ɕύX?\?ȃI?u?W?F?N?g?ł???A?????͂????܂???j?B
?@sentinel?N???X?͂?????ԕ??l?isentinel value?j??\?????邽?߂ɓ???????܂????B?ԕ??l?Ƃ́A???炩?̒l????????Ȃ??A???݂??Ȃ??A?g???Ȃ??Ƃ???????\?????߂Ɏg???܂??BPython?ł?None??object?N???X?̃C???X?^???X??ԕ??l?Ƃ??Ďg?????Ƃ??悭????܂????A????ł͂??܂??????Ȃ??Ƃ??????邱?Ƃ???A?V????sentinel?N???X??????܂????B
?@?ȉ??ł́A???Ɍ??Ă????܂??傤?B
frozendict?N???X
?@??ł??q?ׂ܂??????Afrozendict?I?u?W?F?N?g?͕ύX?s?\?Ȏ????i?}?b?s???O?^?j?ł??B???̃I?u?W?F?N?g?͎????Ɠ??l?ȍ????????܂??B???????A?ufd = {}?v?͋?̎???????邾???ŁA???frozendict?I?u?W?F?N?g?????킯?ł͂Ȃ??_?ɂ͒??ӂ??Ă????????B
fd0 = frozendict() # ???frozendict?I?u?W?F?N?g
fd1 = frozendict({'k0': 'v0', 'k1': 'v1'}) # ????????frozendict???쐬
fd2 = frozendict(k0='v0', k1='v1') # ?L?[???[?h???????g??
fd3 = frozendict([('k1', 'v1'), ('k0', 'v0')]) # ?L?[?^?l??v?f?Ƃ??郊?X?g???g??
fd4 = frozendict(fd3) # frozendict????frozendict???쐬
?@?????Ƒ傫???Ⴄ?̂́Afrozendict?͕ύX?s?\?ȓ_?ɂ???܂??B?L?[?^?l?̑g??lj???????A????̃L?[?̒l??ύX??????͂ł??܂???B
fd1['k2'] = 'v2' # TypeError
?@???????A?l???ύX?\?ȃI?u?W?F?N?g?ł???A???̓??e?͕ύX?\?ł??B????̓^?v???̗v?f???ύX?\?ȃI?u?W?F?N?g?ł???A???̓??e??ύX?ł??邱?ƂƓ??l?ł??B
fd5 = frozendict({'key': ['foo', 'bar']})
print(fd5) # frozendict({'key': ['foo', 'bar']})
fd5['key'][0] = 'FOO'
print(fd5) # frozendict({'key': ['FOO', 'bar']})
?@frozendict?I?u?W?F?N?g?͕ύX?s?\?Ȃ̂ŁA???̃n?b?V???l???v?Z?ł??܂??i?l???ύX?\?ȃI?u?W?F?N?g?łȂ??ꍇ?j?B?ȉ??ł͏?ō쐬????frozendict?I?u?W?F?N?g???g???Ă??܂??B
print(fd1) # frozendict({'k0': 'v0', 'k1': 'v1'})
h1 = hash(fd1)
print(h1) # 6894830583868851914?Ȃǁi???s???ɕω?????j
?@?܂??A???̂悤?ȓ?????????_?ɂ????ӂ??Ă????????B
print(fd2) # frozendict({'k0': 'v0', 'k1': 'v1'})
print(fd3) # frozendict({'k1': 'v1', 'k0': 'v0'})
print(hash(fd2)) # 6894830583868851914?Ȃ?
print(hash(fd3)) # 6894830583868851914?Ȃ?
print(hash(fd2) == hash(fd3)) # True
print(fd2 == fd3) # True
?@2??frozendict?I?u?W?F?N?g?Afd2??fd3?̓L?[?^?l?̑g?̕??т??قȂ?܂??ifrozendict?͗v?f?̑}????????ێ????܂??B?????Python 3.7?ȍ~?̒ʏ?̎????Ɠ??l?ł??j?B?ł????Ahash???̒l?͓????ɂȂ?A?????2??frozendict??==???Z?q?Ŕ?r????Ɠ????l?ł???Ɣ??f?????True???Ԃ???܂??B
?@?????Y??Ă??܂??????Afrozendict?ƒʏ?̎????̔?r???\?ł??B?ȉ??ɗ???????܂??B
print(frozendict({'foo': 'FOO'}) == {'foo': 'FOO'}) # True
print(frozendict({'foo': 'FOO'}) == {'foo': 'FOO', 'bar': 'BAR'}) # False
?@???̂悤??frozendict?Ǝ????͔?r???\?ł????A?????frozendict???????idict?j?̃T?u?N???X??????Ƃ????킯?ł͂???܂???B
print(isinstance(fd0, dict)) # False
?@frozendict?Ǝ????͂Ƃ???collections.abc.Mapping?????????Ă???̂ł????āAfrozendict?Ǝ????̊ԂɌp???W?͂???܂???B
?@????A?ύX?\?ȃI?u?W?F?N?g??l?Ƃ???v?f???܂?ł???frozendict?̓n?b?V?????ɓn???Ɨ?O?????????܂??B
print(fd5) # frozendict({'key': ['FOO', 'bar']})
hash(fd5) # TypeError
?@????frozendict?I?u?W?F?N?g???????̃L?[??W???̗v?f?Ƃ??Ďg???Ă݂܂??傤?B
print(fd0) # frozendict()
print(fd1) # frozendict({'k0': 'v0', 'k1': 'v1'})
print(fd2) # frozendict({'k0': 'v0', 'k1': 'v1'})
print(fd3) # frozendict({'k1': 'v1', 'k0': 'v0'})
print(fd5) # frozendict({'key': ['FOO', 'bar']})
?@fd0?͋??frozendict?ł??Bfd1??fd2?Afd3?̓L?[???l????????i?ύX?s?\?j??frozendict?ł??ifd1??fd2?̓L?[?ƒl?̕??т??????ŁAfd3?͕??т?????????Ă??܂??j?Bfd5??'key'?̒l???ύX?\?ȃI?u?W?F?N?g?ɂȂ??Ă???frozendict?ł??B???????g???āA?܂??͎????̃L?[?Ƃ??Ă݂܂??B
# frozendict?I?u?W?F?N?g???????̃L?[?Ɏg??
d1 = {fd2: 'some value'}
print(d1) # {frozendict({'k0': 'v0', 'k1': 'v1'}): 'some value'}
d2 = {fd5: 'some value'} # TypeError
?@fd2?̓L?[???l???ύX?s?\?ȕ?????ł????B???̂??߁A??????????̃L?[?ɂ??邱?Ƃ͖?肠??܂???ł????B???????A?l?????X?g?ɂȂ??Ă???v?f???܂?fd5???????̃L?[?ɂ????TypeError??O?????????܂????B
?@????͎????ł͂Ȃ??Afrozendict?̃L?[?ɂ??????g???ꍇ?????l?ł??B
# frozendict?I?u?W?F?N?g??frozendict?I?u?W?F?N?g?̃L?[?Ƃ???
fd6 = frozendict(d1)
print(fd6) # frozendict({frozendict({'k0': 'v0', 'k1': 'v1'}): 'some value'})
fd7 = frozendict({fd5: 'some value'}) # TypeError
?@?Ō?ɏW???̗v?f?Ƃ???ꍇ?ł??B?????ł͋??frozendict??L?[?ƒl?̕??т??????قȂ?fd3???܂߂āA?W?????쐬???Ă??܂??B
# frozendict?I?u?W?F?N?g???W???̗v?f?Ƃ???
s1 = set([fd0, fd1, fd2, fd3])
print(s1) # {frozendict(), frozendict({'k0': 'v0', 'k1': 'v1'})}
s2 = set([fd1, fd2, fd3, fd5]) # TypeError
?@?us1 = set([fd0, fd1, fd2, fd3])?v?Ƃ??č쐬?????W???ɂ͋??frozendict?ifd0?j?̑??ɗv?f??1?????ł??Bfd1??fd2?͓????L?[?ƒl???????܂݁A???̕??т?????ł??????Afd3?̓L?[?ƒl?͓????ŕ??т͈قȂ??Ă??܂????B????ł??n?b?V???l???????ł??邱?Ƃ͏?Ŋm?F???܂??????A?????ł?????̗v?f?Ƃ??Ĉ????Ă??邱?Ƃɒ??ӂ??Ă????????B
?@?܂??Afd5???܂߂?Ƃ???܂łƓ??l??TypeError??O?????????܂??B
?@?Ƃ????̂??Afrozendict?̊?{?I?Ȑ????Ƃ?????ł??傤?B?{???͉??Z?Ȃǂɂ??Ă??G?ꂽ?????悢?̂ł????A????͂????܂łƂ??Ă????܂??B
?@?ǂ?ȂƂ????frozendict?͎g???邩???Ȃ??Ȃ???????Ȃ???ł???ˁB?V???v???Ɂu?ύX?ł??Ȃ??v?Ƃ????_?ɒ??ڂ??āA???܂??܂Ȑݒ?̃f?t?H???g?l???i?[????Ƃ??????g?????͂??肻???ł??B
sentinel?N???X
?@sentinel?N???X?͔ԕ??l??\?????߂Ɏg???܂??B?Ⴆ?A?ȉ??̃R?[?h?ɂ??čl???Ă݂܂??B????͒l????????Ȃ????????Ƃ??Ӗ?????ԕ??l?Ƃ???None???g?????Ƃ????R?[?h?ł??B
d = {'foo': 'FOO', 'bar': 'BAR', 'baz': None}
target = 'baz'
result = d.get(target, None)
if result is None:
print(f'key: {target} does not exist')
else:
print(f'key: {target} exist, value: {result}')
?@?????ł͎???d?̃L?['baz'?̒l??None?ɂȂ??Ă??܂??i?????ɂ??ȗ?ł??ˁj?B???̂Ƃ??Ɂud.get(target, None)?v?Ƃ??ăL?['baz'?̒l??T?????Ƃ???ƁA???̂悤?ɂȂ??Ă??܂??܂??B
?@??????????ɂ́A???̂悤?ȃR?[?h???????܂??B
d = {'foo': 'FOO', 'bar': 'BAR', 'baz': None}
MISSING = object()
target = 'baz'
result = d.get(target, MISSING)
if result is MISSING:
print(f'key: {target} does not exist')
else:
print(f'key: {target} exist, value: {result}')
?@????͔ԕ??l?Ƃ???object?^??MISSING?Ƃ????C???X?^???X??V?K?ɍ쐬???āAget???\?b?h?ł̓L?[?????݂??Ȃ??????Ƃ??ɁA?????Ԃ??悤?Ɏw?肷????̂ł??B????ɂ??A??̃R?[?h?ł̓L?['baz'?????݂??A???̒l??None?ł??邱?Ƃ?ł???悤?ɂȂ?܂??B
?@???????Aobject?^?̒l??ԕ??l?Ƃ??Ďg???̂????܂??Ȃ????Ƃ?????܂??B
MISSING = object()
def greet(greeting='hello', to=MISSING):
if to is MISSING:
to = 'world'
print(f'{greeting} {to}')
greet() # hello world
greet(to='Python') # hello Python
greet(greeting='goodbye', to=None) # goodbye None
?@????̓p?????[?^?[to?Ɉ??????^?????Ȃ??????ꍇ?ɂ́A???̒l??MISSING?ƂȂ???̒?`?ł??B???̂??߁ANone??n???Ă??A???????^?????Ȃ??????Ƃ͌??Ȃ???܂???B???????v?????ʂ?̂??̂ł??B???????A????Ɍ^?q???g??t???悤?Ƃ???ƁA?????????????ƂɂȂ?܂??B
from typing import Any
MISSING: Any = object()
def greet(greeting: str = 'hello', to: str | Any = MISSING) -> None:
if to is MISSING:
to = 'world'
print(f'{greeting} {to}')
greet() # hello world
greet(to='Python') # hello Python
greet(greeting='goodbye', to=None) # goodbye None
?@typing.Any?́u?C?ӂ̌^??Any?ƌ݊?????????v???Ƃ??Ӗ????܂??B?܂?A?p?????[?^?[to?́u??????ƔC?ӂ̌^?????v???Ƃ??Ӗ????܂??B??????Č^?`?F?b?N???????I?ɂ͂?????߂邱?ƂɂȂ????Ⴄ?Ƃ??????Ƃł??B???Ȃ݂?Any??object?Ƃ??Ă????ʂ͎????悤?Ȃ??̂ł??BPython?̃I?u?W?F?N?g??object???p?????Ă???̂ŁA?????I?ɂ͑S?ẴI?u?W?F?N?g?????e????Ă??܂??܂??B
?@???̂悤?ɏ]???̂????ł͌^?q???g????????ł???肪???????܂??B?ԕ???\???N???X???`????̂͂???ł????B
class Sentinel:
pass # ?ȗ?
MISSING = Sentinel()
def greet(greeting: str = 'hello', to: str | Sentinel = MISSING) -> None:
pass # ?ȗ?
?@???????A?????????N???X???Œ?`????̂??ʓ|?ł??B?????œo?ꂵ???̂??g?ݍ??݂?sentinel?N???X?Ƃ????킯?ł??B?????f???炵???̂́Asentinel?N???X?̃I?u?W?F?N?g?͓??ʈ???????Ă??āA?^?\???Ɋ܂ނ??Ƃ??\?ȓ_?ł??iNone?Ɠ??l?ł??ˁj?B?ȉ??ɗ???????܂??B
MISSING = sentinel('MISSING')
def greet(greeting: str = 'hello', to: str | MISSING | None = MISSING) -> None:
if to is MISSING:
to = 'world'
print(f'{greeting} {to}')
greet() # hello world
greet(to='Python') # hello Python
greet(greeting='goodbye', to=None) # goodbye None
?@sentinel?N???X?̃I?u?W?F?N?g???쐬????Ƃ??ɂ́A?????Ƃ??Ă??̃I?u?W?F?N?g???\?????????n???܂??B?܂??A??ł??q?ׂ??悤?Ɂuto: str | MISSING | None?v?̂悤?Ɍ^?\????sentinel?I?u?W?F?N?g?????̂܂܋L?q?ł??܂??B???????邱?ƂŁAAny??object?????????Ƀp?????[?^?[?̌^???w??\?ɂȂ?܂??B
?@Python 3.15????́A?ԕ??l???????Ƃ??ɂ́A??????Sentinel?N???X???`????̂ł͂Ȃ??Asentinel?N???X???g?p????̂??悢?ł??傤?B
Copyright© Digital Advantage Corp. All Rights Reserved.
?A?C?e?B???f?B?A????̂??m?点
??IT eBook
?ҏW??????̂??m?点
RSS?ɂ???
?A?C?e?B???f?B?AID?ɂ???
???[???}?K?W???o?^
??IT?̃??[???}?K?W???́A ???????A???ׂĖ????ł??B???Ѓ??[???}?K?W???????w?ǂ????????B
ITmedia?̓A?C?e?B???f?B?A??????Ђ̓o?^???W?ł??B
???f?B?A?ꗗ | ????SNS | ?L???ē? | ???₢???킹 | ?v???C?o?V?[?|???V?[ | RSS | ?^?c??? | ?̗p??? | ??????








