Skip to main content

A Python implementation of the C# nameof operator.

Project description

python-nameof: a Python implementation of C# nameof operator

This is a follow-up to this project since the author archived it, preferring the varname library which used to cover nameof, but then varname deprecated it.

A Python utility that mimics the C# nameof operator, allowing you to get variable, attribute, or property names as strings at runtime.

It is an essential operator to allow flexible and reliable refactoring, among many other things.

This implementation supports string interpolation, so it's easy to reference variable names when logging, e.g.
log.error(f"{nameof(somevariable)} is incorrect").

Installation

Pip:

pip install python_nameof

My recommendation is to always use uv instead of pip – I personally think it's the best package and environment manager for Python.

uv add python_nameof

Usage

Import:

from nameof import nameof

Simple usage:

foo = 123
nameof(foo)  # Output: 'foo'

You can test it in a simple refactoring operation. For example:

def print_variables(temperature: int)
    print(f"The parameter {nameof(temperature)} is: {temperature}")

The parameter temperature is: 34

If you refactor (e.g. VSCode: press F2 on the variable name) the input parameter from temperature to temperature_celsius, you will get:

def print_variables(temperature_celsius: int)
    print(f"The parameter {nameof(temperature_celsius)} is: {temperature_celsius}")

So the printed name follows the name of the actual parameter after a refactor.

The parameter temperature_celsius is: 34

Additional Parameters

The nameof function supports two optional parameters for formatting the output:

  • wrap_in_chars: Wraps the variable name with the specified string at the start and end.
  • replace_with_whitespace: Removes all occurrences of the specified character(s) from the variable name and replaces them with a whitespace. Accepts a string or a list of strings.

These are especially useful if you are logging to markdown format (printing messages as Markdown), to format variable names as code or to remove underscores for readability.

some_param = 1

# Combine both: wrap in backticks and remove underscores
nameof(some_param, "`", "_")  # Output: '`some param`'

This is useful when generating Markdown documentation or error messages:

def print_variables(temperature_celsius: int)
    print(f"The parameter {nameof(temperature_celsius, "`", "_")} is: {temperature_celsius}")

This will plot a nicely formatted markdown, useful if you do logging in markdown:

The parameter temperature celsius is: 34

Multiple assignments

If a variable is assigned twice, only the first name is returned.

a = b = 1

nameof(a) # returns "a"
nameof(b) # returns "b"

nameof(1) # raises ValueError (see next section below)

Error Handling

If you pass a value or an expression that is not a variable or attribute, nameof raises a ValueError:

nameof(42)            # Raises ValueError
nameof("foo.bar")     # Raises ValueError
nameof("nameof(bar)") # Raises ValueError

More usage examples

nameof() supports string interpolation, so it's easier to reference variable names when logging, allowing for easier refactoring.
In the example below, refactoring the name of second_param will propagate to the printed message without having to manually do it.

def myFuncWithAmazingLogging(first_param: int):
    valid_threshold = 10
    if first_param < 10:
        print(f"The parameter {nameof(first_param)} should be less than {valid_threshold}")

It works for class attributes and instance variables.

class Bar:
    attr = 99
bar = Bar()
nameof(Bar.attr)      # Output: 'attr'
nameof(bar.attr)      # Output: 'attr'

It works also for nested classes.

class Inner:
    @property
    def value(self):
        return 10

class Outer:
    def __init__(self):
        self.inner = Inner()

outer = Outer()
nameof(outer.inner.value)  # Output: 'value'

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_nameof-2.0.1.tar.gz (5.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_nameof-2.0.1-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file python_nameof-2.0.1.tar.gz.

File metadata

  • Download URL: python_nameof-2.0.1.tar.gz
  • Upload date:
  • Size: 5.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.11

File hashes

Hashes for python_nameof-2.0.1.tar.gz
Algorithm Hash digest
SHA256 681fafd95b9fe0c3ff9356e7fbb9b2ca14d12f9dd7a23a038747e37e9162a5e7
MD5 877b4ea599f6ae23521c2c2a0269dcad
BLAKE2b-256 ccaf3444a6888f0a4912abfba681b318bd325ae6c4ea83f3861cb376e9f0912b

See more details on using hashes here.

File details

Details for the file python_nameof-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: python_nameof-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.11

File hashes

Hashes for python_nameof-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d1fad5ffe4d4be954e4b8a9bebf88904a0f716e0b6930268c0753e1980462627
MD5 dd35f768a8bcb1ca6c3d70a3eaa54158
BLAKE2b-256 ec3bef040d0c4476bc527d0e46081ef4227dc44d5b00cc889a887c59a35206ff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page