Python Forum
How create programmatically variables ?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How create programmatically variables ?
#1
Question 
Hi everyone,

I would like to create programmatically / automatically some variable inside a function...

I've dig the WWW but I found only very old results that lead to create some Dictionary...

Is my wish possible in Python ?

Thanks.
[Image: NfRQr9R.jpg]
Reply
#2
(Aug-09-2023, 04:11 AM)SpongeB0B Wrote: I've dig the WWW but I found only very old results that lead to create some Dictionary...
Variables in Python are kept in namespaces, which have a dictionary-like semantics. For example global variables in a module are kept in the globals() dictionary, which you could also access as vars(sys.modules[__name__]). You can update these dictionaries to create module-level variables.

Usually however, this is bad practice and it is better to use another dictionary that your program creates.

I see a good use case for this, which is lazy imports of subpackages in a package Spam:
# Spam.__init__.py

def __getattr__(name):
    from importlib import import_module
    submodule = import_module(name, __package__)
    globals()[name] = submodule
    return submodule
Now in client code
import Spam
# accessing Spam.eggs automatically imports submodule Spam.eggs
Spam.eggs.somefunction()

# on second access, nothing is imported because eggs is now a member of Spam
Spam.eggs.otherfunction()
Even in this example, one could avoid updating globals() directly by using setattr(import_module(__name__), name, submodule), emphasizing that we are "setting an attribute" instead of "creating a variable".

A different example of creating a variable 'eggs' in the Python shell
>>> import sys
>>> module = sys.modules[__name__]
>>> module.eggs = 'Humpty Dumpty'
>>> eggs
'Humpty Dumpty'
Reply
#3
DO NOT DO THIS. Use a proper data structure

Why you don't want to dynamically create variables

How do I create variable variables?
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#4
Here is a function to pollute any global dictionary
>>> def pollute_caller_globals():
...     import sys
...     d = sys._getframe(1).f_globals
...     for name in "foobar foo bar baz qux quux corge grault garply waldo fred plugh".split():
...         d[name] = name[::-1].capitalize()
... 
>>> 
>>> pollute_caller_globals()
>>> 
>>> baz
'Zab'
>>> grault
'Tluarg'
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', 
'__spec__', 'bar', 'baz', 'corge', 'foo', 'foobar', 'fred', 
'garply', 'grault', 'plugh', 'pollute_caller_globals', 
'quux', 'qux', 'waldo']
Reply
#5
As mention use data stucture eg a @dataclass() is a simple way.
from dataclasses import dataclass

@dataclass()
class Var:
    x: float
    y: float
    z: int = 1

var = Var(1.5, 2.5)
print(var)
Output:
Var(x=1.5, y=2.5, z=1)
So data is mutable and can change as wish.
If want it immutable just add @dataclass(frozen=True).
>>> var.x = 100.4
>>> var.x
100.4
>>> var
Var(x=100.4, y=2.5, z=1)
The data is also stored in dictionary,to see this can call like this.
>>> var.__dict__
{'x': 100.4, 'y': 2.5, 'z': 1}
Just to clarify this is this same as making variables like this.
>>> x = 100.4
>>> y = 2.5
>>> z = 1
Now will these variables go into globals dictionary,as Gribouillis show some examples of.
But should not mess with globals and use normal visible data structure as eg shown here.
If you unfamiliar with dataclass,here is the same as a ordinary class.
class Var:
    def __init__(self, x: float, y: float, z: int = 1):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return f"Var(x={self.x}, y={self.y}, z={self.z})"

var = Var(1.5, 2.5)
print(var)
Output:
Var(x=1.5, y=2.5, z=1)
Reply
#6
Could you describe why you think you need to create variables? Defining variables is a coding operation. A variable is just a convenient name that is used to access an object. During coding, the programmer keeps track of the variable names. Who keeps track of variable names when they are generated automatically?
Reply
#7
Heart 
Thank you @Gribouillis @buran @snippsat @deanhystad for your input :)

Meanwhile I did create what I was needed with dictionary.

But thanks to yours reply, I will improve it and make a class based on -->

(Aug-09-2023, 03:25 PM)snippsat Wrote:
class Var:
    def __init__(self, x: float, y: float, z: int = 1):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return f"Var(x={self.x}, y={self.y}, z={self.z})"

var = Var(1.5, 2.5)
print(var)

Dance (the happy dance)
[Image: NfRQr9R.jpg]
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Create X Number of Variables and Assign Data RockBlok 8 973 Nov-14-2023, 08:46 AM
Last Post: perfringo
  How to programmatically stop a program in Jupyter Notebook? Mark17 11 37,250 Feb-12-2023, 01:41 PM
Last Post: jp21in
  Create Excel Line Chart Programmatically dee 3 1,200 Dec-30-2022, 08:44 PM
Last Post: dee
  Create array of values from 2 variables paulo79 1 1,103 Apr-19-2022, 08:28 PM
Last Post: deanhystad
  How to create 2 dimensional variables in Python? plumberpy 5 1,866 Mar-31-2022, 03:15 AM
Last Post: plumberpy
  How to programmatically exit without Traceback? Mark17 7 6,315 Mar-02-2021, 06:04 PM
Last Post: nilamo
  Create new variable dependent on two existing variables JoeOpdenaker 6 3,036 Oct-25-2020, 02:15 PM
Last Post: jefsummers
  Adding Language metadata to a PDF programmatically bhargavi22 0 1,950 Aug-17-2020, 12:53 PM
Last Post: bhargavi22
  Create, assign and print variables in loop steven_tr 10 4,361 May-28-2020, 04:26 PM
Last Post: ndc85430
  I can't figure out how to create variables in a while loop MrCag 1 2,370 May-08-2018, 08:56 PM
Last Post: wavic

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020