Learning inheritance

N

Niklasro

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME'] I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?
Thanks
Niklas
 
B

bruno.desthuilliers

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg     url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME']

First learn to use Python correctly:

url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"])

=> dict.get(key, default=None)

Also and FWIW, neither HTTP_HOST not SERVER_NAME are really urls...
I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?

Not enough background to answer.
 
J

Jorgen Grahn

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME'] I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?

Inheritance is not the main tool for sharing code. Just make it a
function and place it in one of your modules (files):

def get_host():
"""Return the environment's $HTTP_HOST if
it exists, otherwise $SERVER_NAME or (if that
doesn't exist either) None.
"""
...

Perhaps you are focusing too much on inheritance in general.
I personally almost never use it in Python -- it has much fewer
uses here than in staticaly typed languages.

/Jorgen
 
N

Niklasro

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg     url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME']

First learn to use Python correctly:

url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"])

=> dict.get(key, default=None)

Also and FWIW, neither HTTP_HOST not SERVER_NAME are really urls...
I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?

Not enough background to answer.

Thanks for replying and informing correctness. More background is the
variable I want accessible for many functions and files either is
HTTP_HOST or SERVER_NAME used as beginning of url or resource locator
indicated where the software is used. Instead of declaring the
variable many times feasibility study is how to minify number of times
I declare the same variable. I got 2 files main.py and i18n both with
webapp request handlers which I would like access the variable.
Thanks
Niklas R
 
C

Carl Banks

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg     url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME'] I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?

Inheritance is not the main tool for sharing code.

That statement might be a little too general to be true. Inheritance
is a (or the) main tool for different objects to share behavior, which
is implemented by code. So when your program is organized around
objects, it is the (or a) main tool.

You are right that you shouldn't rework your code into an OO style
simply because you want to share code. I think that's what you meant.

Just make it a
function and place it in one of your modules (files):

Or even just make it a global variable in the module (which would work
in this case, unless you plan to update the environment within the
program).


Carl Banks
 
A

alex23

Niklasro said:
I got 2 files main.py and i18n both with
webapp request handlers which I would like access the variable.

I'd probably use a module for this. Create a third file, called
something like shared.py, containing the line that bruno gave above:

url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"])

Then from within both main & i18n you can 'import shared' and access
the variable as 'shared.url'.

Python only actually executes a module the first time it's imported,
every other import will be given a reference to the same module
object. This also lets you share temporary data between modules. Any
module that imports 'shared' can add an attribute to it ('shared.foo =
"barbaz"') that will be visible to all other modules that have (or
will have) imported it.
 
N

Niklasro

Hi
How can I make the visibility of a variable across many methods or
files? To avoid repeating the same line eg     url =
os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME'] I repeat for many methods. So declaring it
to a super class and inheriting it is my plan. Do you agree or propose
otherwise?

Inheritance is not the main tool for sharing code. Just make it a
function and place it in one of your modules (files):

def get_host():
   """Return the environment's $HTTP_HOST if
   it exists, otherwise $SERVER_NAME or (if that
   doesn't exist either) None.
   """
   ...

Perhaps you are focusing too much on inheritance in general.
I personally almost never use it in Python -- it has much fewer
uses here than in staticaly typed languages.

/Jorgen

Thanks for sharing the knowledge. I alternatively think about
declaring the variable in a setting.py file and import it. It doesn't
create many objects but I want to learn more professional code
conventions than same test repeated.
Sincerely,
Niklas R
 
N

Niklasro

Niklasro said:
I got 2 files main.py and i18n both with
webapp request handlers which I would like access the variable.

I'd probably use a module for this. Create a third file, called
something like shared.py, containing the line that bruno gave above:

url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"])

Then from within both main & i18n you can 'import shared' and access
the variable as 'shared.url'.

Python only actually executes a module the first time it's imported,
every other import will be given a reference to the same module
object. This also lets you share temporary data between modules. Any
module that imports 'shared' can add an attribute to it ('shared.foo =
"barbaz"') that will be visible to all other modules that have (or
will have) imported it.

I try a file setting.py declaring it like this just loose in the file
not knowing much theory about it thinking it's easy and intuitive.
Thanks
Niklas
 
N

Niklasro

It works but I don't know whether it's formally inheritance or class
variable.

Before code was
url = os.environ['HTTP_HOST'] if os.environ.get('HTTP_HOST') else
os.environ['SERVER_NAME']
if url.find('niklas') > 0:

and now the change saves me from repeating myself!

util.py:
url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"]) #declared
as class variable(?)

And viola just test if util.url.find('niklas') > 0:

Exactly what I wanted to do with your experienced guidance.

Many thanks
Happy refactored
 
T

Thomas Jollans

util.py:
url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"]) #declared
as class variable(?)
There is no class here, so this is no class variable, and you're not
inheriting anything. You're simply using a module.
 
N

Niklasro

url = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"]) #declared
as class variable(?)

There is no class here, so this is no class variable, and you're not
inheriting anything. You're simply using a module.
And viola just test if util.url.find('niklas') > 0:
Exactly what I wanted to do with your experienced guidance.
Many thanks
Happy refactored
Good to learn what I'm doing :) since important being able to explain
choices taken farther than "doing it because it works".
I understand the concept of modules may not correspond to java
programming where I come from.
Sincerely with thanks for the help,
Niklas
 
B

Bruno Desthuilliers

alex23 a écrit :
Python only actually executes a module the first time it's imported,

Beware of multithreading and modules imported under different names...
There can be issues with both in some web frameowrks.
 
B

Bruno Desthuilliers

Niklasro a écrit :
Good to learn what I'm doing :) since important being able to explain
choices taken farther than "doing it because it works".
I understand the concept of modules may not correspond to java
programming where I come from.

Coming from Java - and specially if you only have experience with Java
-, you'll have to unlearn quite a few things. Python is 100% object - in
that everything you can bind to a name is an object, including classes,
functions, methods, and even modules - but it doesn't try to force you
into using classes when you don't need them.
 
A

alex23

Bruno Desthuilliers said:
alex23 a écrit :

Beware of multithreading and modules imported under different names...
There can be issues with both in some web frameowrks.

Good points, Bruno, thank you.

Niklasro, a good example of Bruno's second point: running a module as
a script and then importing it elsewhere later will execute the module
in the second import, creating two module objects - '__main__' and
'<modulename>'.

The issue with threading is the more important one of which to be
aware.
 
N

Niklasro

Niklasro a écrit :


Coming from Java - and specially if you only have experience with Java
-, you'll have to unlearn quite a few things. Python is 100% object - in
that everything you can bind to a name is an object, including classes,
functions, methods, and even modules - but it doesn't try to force you
into using classes when you don't need them.

Which is good since always questioning the empty declarations Java has
we know empty getters and setters forced to a class and interfaces
with nothing but names and no logic. With this respect I prefer python
solving same problem with ½ MB python 30 MB J2EE used to with drawback
only that Java had the faster physical response. You can have the
buggiest code respond the fastest like a hijacked environment
physically boosted you don't want and naturally choosing the slower
physical response time in favor of decent development environment.
Thanks
Niklas
 
N

Niklasro

Good points, Bruno, thank you.

Niklasro, a good example of Bruno's second point: running a module as
a script and then importing it elsewhere later will execute the module
in the second import, creating two module objects - '__main__' and
'<modulename>'.

The issue with threading is the more important one of which to be
aware.

I follow it means learning when constructors get called twice.
Normally a constructor should get called once only.
Many thanks for the insights both solving my problem and referencing
important topics
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top