I have many python files and sometimes I need to check them if they works. So they require different import ways in the file for libraries. The below code explains the situation.
I use else
situations for fles that import XLS
.
XLS.py
if __name__ == "__main__":
import config
else:
import DataLoaders.config as config
However I want to add dataset.py
file to if
situation.
if __name__ == "__main__" or __name__=="dataset.py":
import config
else:
import DataLoaders.config as config
I tried above code but it doesn't work. How to add the file name in if
to import config file as demanded?
CodePudding user response:
Frequently this is better accomplished by either (though logically these end up the same because they both split import logic off)
- splitting off functionality into separate files and importing it where needed
- keeping all of the relevant logic together in a custom class or method of one
An example of this using @classmethod
(which largely exists to aid this sort of design) could be
class MyClass:
@classmethod
def from_XLS(cls, xls_path):
import custom_xls_loader
data = custom_xls_loader.load(xls_path)
# call any other other needed transform methods
# opportunity to make result an instance of this class
# (otherwise why not use a normal function)
return cls(data)
This is used for optional support in many large libraries (where there may be a huge number of busy dependencies that a user may not want or need to install for their use case)
Here's an example from Pandas where some Apache Arrow support is optional https://github.com/pandas-dev/pandas/blob/bbb1cdf13a1e9240b43d691aa0ec3ca1b37afee4/pandas/core/arrays/arrow/dtype.py#L112
Or in your case (referring to config as self.config
in the class or as the .config
property of an instance)
class MyClass
def __init__(self, data, config=None)
if config is None:
import config
self.config = config
@classmethod
def from_config_normal(cls, data):
return cls(data)
@classmethod
def from_DataLoaders_config(cls, data):
import DataLoaders.config as config
return cls(data, config)
CodePudding user response:
__name__
is set to the name of the module, not whatever creates the module. So in XLS.py
, its value is either "__main__"
, if the file is executed as a script, or XLS
, if the module is imported by someone else.
The problem here is that config
is, to some extent, a parameter for your module, whose value is determined elsewhere. (config
, if you execute as a script, Databases.config
if you import from dataset.py
, maybe some other module if you import from elsewhere.)
Python, unfortunately, doesn't allow you to parameterize an import like you can a function. A workaround is to simply leave config
undefined in XLS.py
, and leave the caller the responsibility to set the value appropriately.
# XLS.py
...
if __name__ == "__main__":
import config
...
# dataset.py
import XLS
import DataLoaders
XLS.config = DataLoaders.config
...
This works as long as XLS
doesn't use config
at import time; I assume it's just a name that other functions in the module may refer to when they are called.
CodePudding user response:
__file__
return the path of the python file that is currently running. You can use the fonction os.path.basename()
to extract only the name of the file.
Here is an example:
import os
filename = os.path.basename(__file__)
print(filename)
It returns:
>>> test.py
You can then use a condition to check the name of the file and import the desired modules.