Skip to main content

Python Reference Variables refvars

This repository contains but two simple but extremely useful Python class, new and Reference.

ALSO: C Pointers in Python.

This holy grail of simple python hacks, refvars provides a convenient way to work with references to objects. It allows you to set and get the value of the reference using simple get and set methods.

Usage

To use the refvars class, simply import it into your Python script:

import refvars

Then use new to create a reference to an object:

# Create a reference.
ref = refvars.new[int](0).get_ref()

Note: that new will run a variety of runtime checks to ensure that the reference is being used correctly.

  • The way these checks work is by very basic checking of source code.
  • This can lead to some problems when trying to open your source code file with inspect module.

To fix this:

refvars.disable_runtime_usage_checks()

Now, you can use the Reference to get and set the value of the reference:

# To ensure that the initial value does actually change.
print(ref.get())  # 0

# If we want a function to modify the reference, we can pass the reference to the function.
def modify_reference(ref:"refvars.Reference[int]"):
    ref.set(1)

modify_reference(ref)

print(ref.get())  # 1

Installation

To install the refvars, use pip:

pip install refvars

C Pointers in Python

Yes, you heard it right. You can use refvars to access memory created by C code in Python.

from refvars import alloc

The alloc is much the same to the new class. But instead we use safe_access(< your cb >) to safely access the memory.

from refvars import alloc, Pointer

def callback(ptr:"Pointer") -> None:
	print(f"Address: {ptr.address}")
	# We even have basic error handling to stop you from writing more than 64 bytes.
	more_than_64 = b"X" * 65
	ptr.write(more_than_64)  # This will raise an error.
	
# This allocates 64 bytes of memory.
# Your callback will be called with a `Pointer` object as the only argument.
# On function return, the memory will be freed.
# Meaning that we are (hopefully) safe from memory leaks and cyber attacks.
alloc(64).safe_access(callback)

A working version you can use is:

from refvars import alloc, Pointer

def callback(ptr:"Pointer") -> None:
	print(f"Address: {ptr.address}")
	data = b"Hello, World!"
	ptr.write(data)
	print(ptr.read(len(data)))  # b"Hello, World!"

alloc(1024).safe_access(callback)

Confirmed versions of Python

  • 3.11 - Works perfectly on the old version (before c pointer update).
  • 3.12 - Works perfectly.

License

Covered under the GNU General Public License v2.0.

V0.7 released on 29th/5/2024

Redesign and added accessing c pointers from Python.

Release files for refvars 0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for refvars 0.7
File Interpreter ABI Platform
refvars-0.7-py3-none-any.whl Python 3 none any Details

Release files / refvars-0.7-py3-none-any.whl

Download URL refvars-0.7-py3-none-any.whl
Size 88.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd2161580546d7e2b5e5b22a477b1931b6e4768bd4ba226157cb1132d707d096
BLAKE2b-256 checksum
How to use checksums
291af0355fd3eb80898db29f5be6aac8c4b0defcad46ab3afded993efcfb3871
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

0.7 This release

1 release file

0.6

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page