샘플
pillow 10.4.0: Querying Pillow format registries or codecs directly without Image.init returns empty tables or false negatives, and openable formats like PSD are absent from Image.SAVE
검증된 샘플 — pypi pillow 10.4.0: Querying Pillow format registries or codecs directly without Image.init returns empty tables or false negatives, and openable…
sha256:748ed346c8eb98129d9abc5a30f775c19a3bf4aee5dd0e03698ba0048d5ca464
이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다.
통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다.
MIT-0
실행 증거
선언된 환경과 서명된 실행을 분리해 두었습니다. 이 샘플이 무엇을 어디서 실행했는지 그대로 볼 수 있습니다.
- 증거 기준
- 서명된 컨트랙트 통과
- 검증 영수증
- 3
- 빌드한 서명 키
- 3
선언된 환경
python linux x64 python python pip
검증 실행 환경
| 환경 | 컨트랙트 | 단계 | 실행일 |
|---|---|---|---|
| python 3.12 · linux alpine/x64 · docker ed25519:ac1544ece1e22594 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · python@1 |
2026-08-14 |
| python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · python@1 |
2026-08-18 |
| python 3.12 · linux debian/x64 · docker ed25519:c1973797be207ac4 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · python@1python:3.12-slim@sha256:09f7da3bc104… |
2026-09-08 |
케이스
HOW- 목표
- Querying Pillow format registries or codecs directly without Image.init returns empty tables or false negatives, and openable formats like PSD are absent from Image.SAVE
- 패키지
- 심벌
-
- PIL.Image.init
- PIL.Image.SAVE
- PIL.Image.OPEN
- PIL.Image.EXTENSION
- PIL.Image.registered_extensions
- PIL.features.check
- 환경
- python
- 생성일
- 2026-08-14T22:44:16Z
컨트랙트
- assert len(Image.SAVE) == 0 before Image.init()
- assert 'PNG' not in Image.SAVE before Image.init()
- assert 'PNG' in Image.SAVE after Image.init()
- assert 'png' not in Image.SAVE and '.jpg' not in Image.SAVE
- assert Image.EXTENSION['.jpg'] == 'JPEG'
- assert 'PSD' in Image.OPEN and 'PSD' not in Image.SAVE
- assert features.check('png') is False and features.check('zlib') is True
파일
- NOTES.md
- csx.json
- requirements.txt
- src/format_checker.py
- test/contract.py
소스
A naive model would check `'PNG' in Image.SAVE` or `features.check('png')` without calling `Image.init()`, or assume formats listed in `Image.registered_extensions()` / `Image.OPEN` (like PSD) can be saved.
The wrong approach fails silently with false negatives (e.g. `'PNG' in Image.SAVE` returns `False` because registries are empty before `Image.init()`) or fails loudly at runtime with `KeyError: 'PSD'` when saving read-only formats despite clean static type checks.
{"case":{"caseId":"case:sha256:58eec5cbe25097cf99b38de97b8a862a90e07b2fd4afd531f1223c2febe17cbe","constraints":{"runtime":"python"},"contract":["assert len(Image.SAVE) == 0 before Image.init()","assert 'PNG' not in Image.SAVE before Image.init()","assert 'PNG' in Image.SAVE after Image.init()","assert 'png' not in Image.SAVE and '.jpg' not in Image.SAVE","assert Image.EXTENSION['.jpg'] == 'JPEG'","assert 'PSD' in Image.OPEN and 'PSD' not in Image.SAVE","assert features.check('png') is False and features.check('zlib') is True"],"goal":"Querying Pillow format registries or codecs directly without Image.init returns empty tables or false negatives, and openable formats like PSD are absent from Image.SAVE","kind":"HOW","packages":["pkg:pypi/pillow@10.4.0"],"schemaVersion":1,"symbols":["PIL.Image.init","PIL.Image.SAVE","PIL.Image.OPEN","PIL.Image.EXTENSION","PIL.Image.registered_extensions","PIL.features.check"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/pillow@10.4.0"],"schemaVersion":1,"symbols":["PIL.Image.init","PIL.Image.SAVE","PIL.Image.OPEN","PIL.Image.EXTENSION","PIL.Image.registered_extensions","PIL.features.check"],"verifierAdapter":"python@1"}
pillow==10.4.0
from PIL import Image
def is_saveable_format(format_or_extension: str) -> bool:
"""Return True if Pillow can save to the specified format name or file extension."""
Image.init()
target = format_or_extension.strip()
if target.startswith("."):
canonical = Image.EXTENSION.get(target.lower())
return bool(canonical and canonical in Image.SAVE)
canonical_direct = target.upper()
if canonical_direct in Image.SAVE:
return True
canonical_ext = Image.EXTENSION.get(f".{target.lower()}")
return bool(canonical_ext and canonical_ext in Image.SAVE)
import io
import os
import sys
import warnings
# Add parent directory to path so src can be imported
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from PIL import Image, features
from src.format_checker import is_saveable_format
def test_lazy_initialization_trap():
# Before Image.init(), format registries are completely unpopulated.
# A naive model expects 'PNG' in Image.SAVE immediately after import.
assert len(Image.SAVE) == 0
assert len(Image.OPEN) == 0
assert len(Image.EXTENSION) == 0
assert "PNG" not in Image.SAVE
assert ".png" not in Image.EXTENSION
def test_save_registry_after_init():
# Calling Image.init() populates the internal plugin registries.
Image.init()
assert len(Image.SAVE) > 0
assert len(Image.OPEN) > 0
assert len(Image.EXTENSION) > 0
assert "PNG" in Image.SAVE
assert "JPEG" in Image.SAVE
def test_case_and_extension_normalization():
# Image.SAVE keys are strictly uppercase canonical format names,
# NOT file extensions, NOT lowercase names, and NOT extension aliases (e.g. JPG).
assert "png" not in Image.SAVE
assert ".png" not in Image.SAVE
assert "jpg" not in Image.SAVE
assert "JPG" not in Image.SAVE
assert ".jpg" not in Image.SAVE
# File extensions must be mapped through Image.EXTENSION to find the canonical key
assert Image.EXTENSION[".jpg"] == "JPEG"
assert Image.EXTENSION[".jpeg"] == "JPEG"
assert Image.EXTENSION[".png"] == "PNG"
assert Image.EXTENSION[".jpg"] in Image.SAVE
def test_read_vs_save_asymmetry():
# registered_extensions() / Image.OPEN only prove decoders (read capability),
# NOT encoder/save capability.
assert "PSD" in Image.OPEN
assert ".psd" in Image.registered_extensions()
assert "PSD" not in Image.SAVE
# Attempting to save an open-only format fails with KeyError
img = Image.new("RGB", (8, 8), color="white")
sink = io.BytesIO()
try:
img.save(sink, format="PSD")
raise AssertionError("Expected KeyError when saving unsupported PSD format")
except KeyError as exc:
assert exc.args[0] == "PSD"
def test_features_check_codec_naming():
# features.check does not accept format strings like 'png' or 'jpeg'.
# It requires low-level codec names like 'zlib' and 'jpg'.
with warnings.catch_warnings(record=True) as recorded_warnings:
warnings.simplefilter("always")
assert features.check("png") is False
assert features.check("jpeg") is False
assert len(recorded_warnings) == 2
assert any("Unknown feature 'png'" in str(w.message) for w in recorded_warnings)
assert any("Unknown feature 'jpeg'" in str(w.message) for w in recorded_warnings)
assert features.check("zlib") is True
assert features.check("jpg") is True
def test_format_checker_helper():
assert is_saveable_format(".png") is True
assert is_saveable_format(".jpg") is True
assert is_saveable_format(".jpeg") is True
assert is_saveable_format("png") is True
assert is_saveable_format("jpg") is True
assert is_saveable_format("JPEG") is True
assert is_saveable_format(".psd") is False
assert is_saveable_format("psd") is False
assert is_saveable_format("PSD") is False
assert is_saveable_format(".nonexistent") is False
if __name__ == "__main__":
test_lazy_initialization_trap()
test_save_registry_after_init()
test_case_and_extension_normalization()
test_read_vs_save_asymmetry()
test_features_check_codec_naming()
test_format_checker_helper()
print("All contract assertions passed successfully.")