A Python package and command-line utility to generate unique and memorable names (e.g., talented-toucan, naughty-watermelon) and IDs (e.g., broken-radio-7ab4g). These names/IDs are ideal for naming temporary directories, user session IDs, gamer tags, project names, process names, or submitted jobs.
The generated names cover a wide range of thematic categories, including science, animals, or history, often with a humorous twist. While creating unique-namer, I was inspired by the creative names used by Docker for its containers and Nextflow for its processes.
- Over 17 million unique names
- Nearly infinite unique identifiers
- 25 categories
- Customizable names and categories
- Categories
- Requirements
- Installation
- Using Without Installation
- Usage
- Command-line Utility
- Versioning
- Tests
- License
Categories allow you to customize generated names to fit the specific topic or theme of your project. The default category, general, includes widely recognized nouns and excludes more specialized or uncommon terms.
| - | Category | Nouns count | Example name | Possible combinations | |
|---|---|---|---|---|---|
| Names | IDs (suffix 4) | ||||
| __all__ | 8,189 | awful-deadline |
17,196,900 | 1013 | |
| πΈ | animals | 460 | tan-octopus |
966,000 | 1012 |
| π¬ | architecture | 134 | blowing-facade |
281,400 | 1011 |
| π¨ | art | 177 | nonchalant-picasso |
371,700 | 1011 |
| π | astronomy | 124 | ruthless-meteoroid |
260,400 | 1011 |
| π | biology | 729 | shiny-centriole |
1,530,900 | 1012 |
| π§ͺ | chemistry | 255 | junior-peroxide |
535,500 | 1011 |
| πΊπΈ | countries | 182 | satisfying-tanzania |
382,200 | 1011 |
| π» | computer_science | 334 | funny-malware |
701,400 | 1012 |
| π° | economy | 175 | flowery-income |
367,500 | 1011 |
| π | food | 217 | pretty-waffle |
455,700 | 1011 |
| π | geography | 185 | enjoyed-tsunami |
388,500 | 1011 |
| β | general | 5,469 | curvy-flight |
11,484,900 | 1013 |
| π° | history | 156 | cool-epoch |
327,600 | 1011 |
| π | literature | 587 | winning-limerick |
1,232,700 | 1012 |
| π | math | 157 | peachy-prime |
329,700 | 1011 |
| π₯ | medicine | 700 | curly-diarrhea |
1,470,000 | 1012 |
| π | microbiology | 130 | crazy-bacteria |
273,000 | 1011 |
| π¬ | molecular_biology | 220 | retired-oligonucleotide |
462,000 | 1011 |
| π΅ | music | 203 | solid-contrabassoon |
426,300 | 1011 |
| physics | 147 | terrible-pressure |
308,700 | 1011 | |
| π» | plants | 178 | anonymous-cactus |
373,800 | 1011 |
| science | 876 | golden-hertz |
1,839,600 | 1012 | |
| π§βπ» | scientists | 101 | gifted-newton |
212,100 | 1011 |
| π | sports | 191 | intergalactic-olympics |
401,100 | 1011 |
| π‘ | technology | 228 | awesome-drone |
478,800 | 1011 |
- Python version 3.6 or higher
- No external dependencies are required
Install unique-namer from PyPI:
pip install unique-namerAlternatively, you can install the latest version directly from GitHub:
pip install "git+https://github.com/aziele/unique-namer.git"If you prefer to use unique-namer without installation, you can clone or download the repository:
git clone https://github.com/aziele/unique-namer.git
cd unique-namer/src/You can import namer in Python:
python
>>> import namer
>>> namer.__doc__
'Generate unique, human-readable, and memorable names or identifiers'You can also use unique-namer as a command-line tool:
python -m namerThe generate function returns a string with a randomly generated name consisting of an adjective and a noun.
import namer
name = namer.generate()
print(name) # Example: 'blushy-cyclist'The generate function selects nouns from the general category by default. If category is provided as a list of categories, the function randomly chooses one category from the list to generate a noun. Each category is chosen with equal probability, regardless of the number of nouns it contains.
import namer
name = namer.generate(category='astronomy')
print(name) # Example: 'crazy-supernova'
name = namer.generate(category=['physics', 'biology'])
print(name) # Example: 'pink-bacteria'To use all available categories, set the category argument to __all__.
import namer
name = namer.generate(category='__all__')
print(name) # Example: 'lonely-momentum'Adds a random suffix of the specified length to the generated name to create a unique identifier. The suffix consists of alphanumeric characters (0-9a-z).
import namer
name = namer.generate(category='history', suffix_length=3)
print(name) # Example: 'annoying-cleopatra-9a1'Specifies the separator to use between the adjective, noun, and suffix in the generated name.
import namer
name = namer.generate(category='sports', separator='_')
print(name) # Example: 'savage_judo'Specifies the text case format of the generated name.
import namer
name = namer.generate(suffix_length=5, style='uppercase')
print(name) # Example: 'DAMAGED-ELECTRON-J20ZX'
name = namer.generate(separator=' ', style='title')
print(name) # Example: 'Lazy Unicorn'To tailor the generated names to your specific project needs, such as adding a date or project name, use the _generate function. This function returns a Python list of name components and a separator. You can modify the list and then format it into a string.
Here's an example:
import namer
# Generate name components
name_components, separator = _generate(category='food', suffix_length=3)
print(name_components) # Example: ['macho', 'pizza', '7dx']
# Create custom generate function
def my_generate(*args, **kwargs):
name_components, separator = namer_generate(*args, **kwargs)
name_components.insert(0, '2024')
return separator.join(name_components)
name = my_generate(category='food', suffix_length=3)
print(name) # Example: 2024-macho-pizza-7dxYou can retrieve the list of available categories using the list_categories function.
import namer
print(namer.list_categories())
# ['animals', 'architecture', ..., 'sports', 'technology']To generate names or IDs tailored to your project, you can add custom categories. Extend the namer.data.categories dictionary with lists of words representing your custom category.
import namer
# Create two subcategories.
my_dogs = ['charlie', 'bella', 'biga']
my_cats = ['tommy', 'lucy']
# Add a custom category named 'my_pets' containing both dogs and cats
namer.data.categories['my_pets'] = [my_dogs, my_cats]
# Generate a name from the 'my_pets' category
name = namer.generate(category='pets')
print(name) # Example: 'thankful-tommy'The tool is available as a command-line utility.
namer -hor
python -m namer -hThe stats command prints a table with name/ID statitics for each category.
namer statsOutput:
Category Nouns Example Name_combs ID_combs (4-char suffix)
__all__ 8189 changing-wages 17,196,900 3e+13
animals 460 delightful-crawdad 966,000 2e+12
architecture 134 quantum-bracket 281,400 5e+11
art 177 potent-pastel 371,700 6e+11
astronomy 124 polished-ionosphere 260,400 4e+11
biology 729 wooden-organs 1,530,900 3e+12
chemistry 255 democratic-periodicity 535,500 9e+11
countries 182 backstabbing-sweden 382,200 6e+11
computer_science 334 precious-cdrom 701,400 1e+12
economy 175 fierce-debt 367,500 6e+11
food 217 offline-tartar 455,700 8e+11
geography 185 odd-hurricane 388,500 7e+11
general 5469 suited-transposition 11,484,900 2e+13
history 156 evident-marcopolo 327,600 6e+11
literature 587 understood-rhetor 1,232,700 2e+12
math 157 vengeful-resultant 329,700 6e+11
medicine 700 ruling-rehabilitation 1,470,000 2e+12
microbiology 130 glistening-alexfleming 273,000 5e+11
molecular_biology 220 painful-electroporation 462,000 8e+11
music 203 flush-bass 426,300 7e+11
physics 147 randomized-quark 308,700 5e+11
plants 178 wakeful-daffodil 373,800 6e+11
science 876 fair-asterism 1,839,600 3e+12
scientists 101 damp-curie 212,100 4e+11
sports 191 blaring-racer 401,100 7e+11
technology 228 renewed-drones 478,800 8e+11
The generate command creates a list of names or IDs based on specified parameters.
namer generate 5Output:
telling-adrenaline
infinite-gonad
close-span
bloody-blow
puffy-biology
To generate 10 IDs from the physics and biology categories, with a random suffix of 3 characters, using _ as a separator, and converting name style to title, use
namer generate 10 --category physics --category biology --suffix_length 3 -- \
separator _ --style titleOutput:
Visiting_Haploid_Eep
Eventual_Refraction_Cnr
Snugly_Monod_Sim
Cruel_Codon_46p
Relieved_Decibel_Cn5
Underground_Bug_7wf
Super_Acre_30r
Guttural_Farad_E1w
Lead_Stalk_Fi4
Formidable_Field_621
The package follows Semantic Versioning with the format MAJOR.MINOR.PATCH:
- MAJOR version: significant changes (e.g., new features, major code reorganizations).
- MINOR version: category-related updates (e.g., adding/moving categories).
- PATCH version: bug fixes or vocabulary expansions without changing the list of categories.
To ensure that unique-namer works as expected, you can run tests using pytest.
pytest tests
