Skip to main content

namedtuple Maker

GitHub Actions Status

Easily Convert Python iterable objects into namedtuple objects

Contents


Capabilities

  • Converts Python iterable objects (list, tuple, set, etc.) into a namedtuple objects using a decorator function, so you don't have to rewrite code that already returns iterable objects.

  • Gathers namedtuple attribute names via either a kwarg in a decorated function or using prompts to collect attribute names.

  • Automatically corrects attribute name entries that would be invalid.


Requirements

  • Python 3.9+

Installation

Install via Python pip:

pip install namedtuple-maker

Usage

Usage as a Decorator

Click to expand and view a decorator example
  1. Create an iterable object:

    my_favorites = (
        'pizza',
        'summer',
        'too personal'
    )
    
  2. Import the convert_to_namedtuple decorator function:

    from namedtuple_maker.namedtuple_maker import named_tuple_converter
    
  3. Create a function that returns an iterable object, and decorate that function with the convert_to_namedtuple decorator function:

    @named_tuple_converter
    def tuple_to_namedtuple(
        iterable_input=my_favorites,
        attribute_names=None
    ):
    
        return iterable_input
    
  4. Call the tuple_to_namedtuple function:

    • Pass an iterable object (the default my_favorites object, in this example) to the iterable_input parameter.
    • By default, you will receive a prompt to provide an attribute name for each iterable input value.
    • You may instead pass a separate iterable object of attribute names to the attribute_names parameter.
    Option #1 - Enter attribute names using prompts:
    # Call the tuple_to_namedtuple function and fill the attribute name prompts
    my_named_favorites = tuple_to_namedtuple()
    
    Enter an attribute name for the value "pizza": food
    Enter an attribute name for the value "summer": season
    Enter an attribute name for the value "too personal": sports team
    
    Option #2 - Pass an iterable object of attribute names to the `attribute_names` parameter:
    # Create an iterable object with attribute names
    my_attributes = (
        'food',
        'season',
        'sports team'
    )
    
    # Call the make_named_tuple function and pass in the attribute names
    my_named_favorites = tuple_to_namedtuple(
        attribute_names=my_attributes
    )
    
  5. Display the resulting namedtuple object:

    print(my_named_favorites)
    
  6. Observe the print function output:

    NamedTuple(food='pizza', season='summer', sports_team='too personal')
    

Usage as a Function

Click to expand and view a function usage example
  1. Create an iterable object:

    my_favorites = (
        'pizza',
        'summer',
        'too personal'
    )
    
  2. Import the make_named_tuple function:

    from namedtuple_maker.namedtuple_maker import make_named_tuple
    
  3. Call the make_named_tuple function:

    • Pass an iterable object (the default my_favorites object, in this example) to the iterable_input parameter.
    • By default, you will receive a prompt to provide an attribute name for each iterable input value.
    • You may instead pass a separate iterable object of attribute names to the attribute_names parameter.
    Option #1 - Enter attribute names using prompts:
    # Call the make_named_tuple function and fill the attribute name prompts
    my_named_favorites = make_named_tuple(
        iterable_input=my_favorites
    )
    
    Enter an attribute name for the value "pizza": food
    Enter an attribute name for the value "summer": season
    Enter an attribute name for the value "too personal": sports team
    
    Option #2 - Pass an iterable object of attribute names to the `attribute_names` parameter:
    # Create an iterable object with attribute names
    my_attributes = (
        'food',
        'season',
        'sports team'
    )
    
    # Call the make_named_tuple function and pass in the attribute names
    my_named_favorites = make_named_tuple(
        iterable_input=my_favorites,
        attribute_names=my_attributes
    )
    
  4. Display the resulting namedtuple object:

    print(my_named_favorites)
    
  5. Observe the print function output:

    NamedTuple(food='pizza', season='summer', sports_team='too personal')
    

Background

Python tuple objects are great, right? So are list, set, and many other iterable Python objects. However, accessing the values of an iterable object using arbitrary index numbers can make code difficult to read. For example, the following list object stores data about the foods I might eat in a given day:

my_meals = [
    'pizza',
    'blueberry pancakes',
    'granola',
    'fruit smoothie',
    'rice and beans'
]

Let's say that I want to access values in the list object named my_food. I can do that by referencing one or more numeric list indices like this:

print('My Meals')
print('--------')
print(f'Breakfast: {my_meals[1]}\n'
      f'Snack: {my_meals[3]}\n'
      f'Lunch: {my_meals[4]}')

The resulting output from this code is:

My Meals
--------
Breakfast: blueberry pancakes
Snack: fruit smoothie
Lunch: rice and beans

That works just fine, although it's not terribly intuitive to associate a list (or tuple) index number with a certain meal of the day, since this list doesn't have meals in any particular order. The list index assigned to each meal is arbitrary.


The Python namedtuple Function

The collections module in the Python Standard Library includes the namedtuple function, which allows you to, as the name implies, create tuple-like objects with values that you can reference by name. What does that mean, practically? Well, it means you can access the values in an iterable object by an explicit attribute name that is much more meaningful than an arbitrary index number.

For example, I'll recreate the my_meals data using a namedtuple object:

  1. First, import the namedtuple function from the collections module:

    from collections import namedtuple
    
  2. Next, create a new object type using the namedtuple function.

    • Think of a namedtuple object like a class object with named attributes, but no methods.
    • The typename parameter is an arbitrary name for the object class.
    • The field_names parameter defines the attribute names for the new object.
    Meals = namedtuple(
        typename='Meals',
        field_names=[
            'breakfast',
            'snack',
            'lunch',
            'dinner',
            'dessert'
        ]
    )
    
  3. Now, create an instance of the Meals object, and assign the individual foods to each of the named attributes (specified by the field_names parameter):

    my_meals = Meals(
        breakfast='blueberry pancakes',
        snack='fruit smoothie',
        lunch='rice and beans',
        dinner='pizza',
        dessert='granola'
    )
    

When I want to access or display data from the namedtuple object named my_meals, my code will look something like this:

print('My Meals')
print('--------')
print(f'Breakfast: {my_meals.breakfast}\n'
      f'Snack: {my_meals.snack}\n'
      f'Lunch: {my_meals.lunch}')

The result from this code looks exactly like it did in the first example:

My Meals
--------
Breakfast: blueberry pancakes
Snack: fruit smoothie
Lunch: rice and beans

The key difference between the list example and the namedtuple example is, accessing the values in the namedtuple object uses explicit named attributes (my_meals.lunch), rather than arbitrary index numbers (my_meals[4]).

For me, it's much easier to remember that the food I ate for breakfast is accessible as my_foods.breakfast within a namedtuple object, than it is to remember an arbitrary list index value like my_foods[3].


namedtuple objects and The Zen of Python

The Zen of Python is a great guide for how to write clean and effective Python code. Below is an extract of some of the lines in the output of an import this command.

The intent of the named-tuplemaker package is to help Python developers write code that improves compliance with The Zen of Python by making it simple and easy to access iterable object values by explicit attribute names, rather than arbitrary index numbers.

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
...
Readability counts.
...

Metadata

Release files for namedtuple-maker 1.0.9

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

Source distribution (sdist)

Source distribution for namedtuple-maker 1.0.9
File Size Uploaded
namedtuple-maker-1.0.9.tar.gz 10.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for namedtuple-maker 1.0.9
File Interpreter ABI Platform
namedtuple_maker-1.0.9-py3-none-any.whl Python 3 none any Details

Total release size: 21.0 kB

Release files / namedtuple-maker-1.0.9.tar.gz

Download URL namedtuple-maker-1.0.9.tar.gz
Size 10.4 kB
Tags Source
SHA-256 checksum
How to use checksums
1024d212fee484446ade99ca57867b7baa2a84cc9d34effa39df72346a7b24c5
BLAKE2b-256 checksum
How to use checksums
a42ceef7ccbd777d64f1ec2cd9f39a734e0224c4da226046833736d4235a88f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.6

Release files / namedtuple_maker-1.0.9-py3-none-any.whl

Download URL namedtuple_maker-1.0.9-py3-none-any.whl
Size 10.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
027ae2d81a972b357708dfee04e94876a6bf7ac9ec1d713de065d97c9202f728
BLAKE2b-256 checksum
How to use checksums
22459e92915e1c54d0951a334f91c0db80c00e88c4800da46082a20db7188169
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.6

Release history Release notifications | RSS feed

This release

1.0.9 This release

2 release files

1.0.8

2 release files

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