winregでREG_QWORDを無理やり読み書きする方法

今のところPythonのwinregはREG_QWORDに対応していない。しかしwinregのソースを見てみたところ、未知のデータ型はバイナリ扱いにするようなので、整数をバイナリに変換すれば読み書きできることに気がついた。

具体的にはwinreg.SetValueEx()を呼ぶ前にデータをstruct.packしておく

#! python3.2
import winreg
import struct

with winreg.CreateKeyEx(winreg.HKEY_CURRENT_USER, r'Software\__test__') as key:
    data = 12345678901234567890
    
    if hasattr(winreg, 'REG_QWORD'):
        regtype = winreg.REG_QWORD
    else:
        # REG_QWORD未対応の場合
        regtype = 11
        data = struct.pack('Q', data)
    
    winreg.SetValueEx(key, 'quadValue', 0, regtype, data)

また、winreg.QueryValueEx()を呼んだ後にデータをstruct.unpackする

import winreg
import struct

REG_QWORD = 11

with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\__test__') as key:
    data, regtype = winreg.QueryValueEx(key, 'quadValue')

    if not hasattr(winreg, 'REG_QWORD') and regtype == REG_QWORD:
        # REG_QWORD未対応の場合
        data = struct.unpack('Q', data)[0]

    print(data)

という方法でうまくいく。

そもそもwinregはREG_BINARYの処理をswitch文のdefaultにフォールスルーしているので、元からこういう風に書くことを狙っているのではないかという気がしてきた。