- Short description
- Useful links
- Installation
- databases
- miscellaneous
- type_functions
- Report a bug or suggest an idea
- Express your gratitude
⠀The library contains convenient functions that are designed to replace routine actions. The library was created by the author to simplify personal work with the tools he uses, such as:
- Regular Python objects;
- MySQL;
- SQLAlchemy;
- Selenium, etc.
⠀After a while, he decided to publish the library, so if you find something useful for yourself, be sure to use it!
⠀You need execute the command below to install or update the library:
pip install --force-reinstall git+https://github.com/SecorD0/pretty-utils⠀It's a class to interact with a MySQL database via SQL queries. __init__ initializes a class.
⠀Accepted arguments:
database (str)— a database namehost (str)— IP:port for connection to DBuser (str)— a username for connectionpasswd (str)— a password for connection**kwargs— other arguments for connecting
⠀Usage:
import os
from pretty_utils.databases.mysql import DB
db = DB(database='bot', passwd=str(os.getenv('DB_PASSWORD')))⠀Executes SQL queries.
⠀Accepted arguments:
query (str)— a querydata (tuple)— a data for queryfetchone (bool)— ifTrueusesfetchone, otherwise usesfetchallin SELECT queries
⠀Usage:
import os
from pretty_utils.databases.mysql import DB
db = DB(database='bot', passwd=str(os.getenv('DB_PASSWORD')))
db.execute('CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, u_id INT, username VARCHAR(255))')
db.execute('INSERT INTO users (u_id, username) VALUES (%s, %s)', (33, 'username',))
db.execute('INSERT INTO users (u_id, username) VALUES (%s, %s)', (102, 'gok',))
res = db.execute('SELECT * FROM users')
print(res)
# [(1, 33, 'username'), (2, 102, 'gok')]
db.execute('UPDATE users SET username = %s WHERE u_id = %s', ('new_username', 33,))
res = db.execute('SELECT * FROM users', fetchone=True)
print(res)
# (1, 33, 'new_username')⠀It's a class that simplifies working with the SQLAlchemy library. __init__ initializes a class.
⠀Accepted arguments:
db_url (str)— a URL containing all the necessary parameters to connect to a DB**kwargs— other arguments for connecting
⠀Usage:
from pretty_utils.databases.sqlalchemy_ import DB
db = DB('sqlite:///users.db', pool_recycle=3600, connect_args={'check_same_thread': False})⠀Creates a database if it doesn't exist. Used automatically during initialization.
⠀Accepted arguments:
database (str)— a database name
⠀Creates tables.
⠀Accepted arguments:
base— a base class for declarative class definitions
⠀Usage:
from pretty_utils.databases.sqlalchemy_ import DB
from sqlalchemy import Column, Integer, Text
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
u_id = Column(Integer)
username = Column(Text)
db = DB('sqlite:///users.db', pool_recycle=3600, connect_args={'check_same_thread': False})
db.create_tables(Base)⠀Fetches all rows.
⠀Accepted arguments:
entities— an ORM entitycriterion— criterion for rows filtering
⠀Returns list — the list of rows.
⠀Usage:
...
users: List[User] = db.all(User)
print(users)
# [User(...), User(...), ...]⠀Fetches one row.
⠀Accepted arguments:
entities— an ORM entitycriterion— criterion for rows filteringfrom_the_end— get the row from the end
⠀Returns list — found row or None.
⠀Usage:
...
user: User = db.one(User, (User.u_id == 33) & (User.username == 'username'))
print(user)
# User(id=1, u_id=33, username='username')⠀Executes SQL query.
⠀Accepted arguments:
query— the queryargs— any additional arguments
⠀Usage:
...
temp_users: List[User] = db.execute('SELECT * FROM temp').fetchall()
print(temp_users)
# [User(...), User(...), ...]
db.execute('DROP TABLE temp')⠀Commits changes.
⠀Usage:
...
user: User = db.one(User, (User.u_id == 33) & (User.username == 'username'))
user.username = 'new_username'
db.commit()⠀Inserts rows.
⠀Accepted arguments:
row— an ORM entity or list of entities
⠀Usage:
...
users = [User(u_id=33, username='username'), User(u_id=102, username='gok')]
db.insert(users)
db.insert(User(u_id=903, username='penny'))⠀It's a class to interact with a SQLite3 database via SQL queries. __init__ initializes a class.
⠀Accepted arguments:
database_file (str)— a path to the database**kwargs— other arguments for connecting
⠀Usage:
import os
from pretty_utils.databases.sqlite import DB
db = DB(os.path.join('databases', 'database.db'))⠀Executes SQL queries.
⠀Accepted arguments:
query (str)— a querydata (tuple)— a data for queryfetchone (bool)— ifTrueusesfetchone, otherwise usesfetchallin SELECT querieswith_column_names (bool)— ifTruereturns column names in SELECT queries (False)return_class (bool)— ifTruereturns dynamic class, otherwise returns tuple (True)
⠀Usage:
from pretty_utils.databases.sqlite import DB
db = DB('database.db')
db.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, u_id INTEGER, username TEXT)')
db.execute('INSERT INTO users (u_id, username) VALUES (?, ?)', (33, 'username',))
db.execute('INSERT INTO users (u_id, username) VALUES (?, ?)', (102, 'gok',))
res = db.execute('SELECT * FROM users')
print(res)
# [data(id=1, u_id=33, username='username'), data(id=2, u_id=102, username='gok')]
res = db.execute('SELECT * FROM users', return_class=False)
print(res)
# [(1, 33, 'username'), (2, 102, 'gok')]
db.execute('UPDATE users SET username = ? WHERE u_id = ?', ('new_username', 33,))
res = db.execute('SELECT * FROM users', fetchone=True)
print(res)
# data(id=1, u_id=33, username='new_username')⠀Dynamically creates a class for received data similar to the one in SQLAlchemy, but without explicitly specifying instance variables.
⠀Accepted arguments:
class_name (str)— a class namevariables (Union[list, tuple])— variables of the classvalues (Union[list, tuple])— values of the specified variables
⠀Returns object — a created class.
⠀Usage:
from pretty_utils.databases.sqlite import dynamic_class
print(dynamic_class('my_class', ('u_id', 'username'), (33, 'username')))
# my_class(u_id=33, username='username')⠀Function was deprecated, use DB class.
⠀Various functions for different purposes.
⠀Functions for working with files.
⠀Join the path passed in the list or tuple.
⠀Accepted arguments:
path (Union[str, tuple, list])— path to the object
⠀Returns str — the joined path.
⠀Usage:
from pretty_utils.miscellaneous.files import join_path
path = join_path('data/images/1.png')
print(path)
# data/images/1.png
path = join_path(('data', 'images', '1.png'))
print(path)
# data\images\1.png
path = join_path(['data', 'images', '1.png'])
print(path)
# data\images\1.png⠀Create an object (file or directory) if it doesn't exist.
⠀Accepted arguments:
path (Union[str, tuple, list])— path to the objectfile (bool)— is it a file? (false)
⠀Returns bool — True if the object was created.
⠀Usage:
from pretty_utils.miscellaneous.files import touch
resp = touch(path='images')
print(resp)
# True
resp = touch(path='images')
print(resp)
# False
resp = touch(path='text.txt', file=True)
print(resp)
# True⠀Write Python list or dictionary to a JSON file.
⠀Accepted arguments:
path (Union[str, tuple, list])— path to the JSON fileobj (Union[list, dict])— the Python list or dictionaryindent (Optional[int])— the indent level (None)encoding (Optional[str])— the name of the encoding used to decode or encode the file (None)
⠀Usage:
from pretty_utils.miscellaneous.files import write_json
users = [{'id': 33, 'username': 'username'}, {'id': 102, 'username': 'gok'}]
write_json(path='users.json', obj=users, indent=2)⠀Read a file and return a list of lines.
⠀Accepted arguments:
path (Union[str, tuple, list])— path to the fileskip_empty_rows (bool)— if True it doesn't include empty rows to the listencoding (Optional[str])— the name of the encoding used to decode or encode the file (None)
⠀Returns list — the list of lines.
⠀Usage:
from pretty_utils.miscellaneous.files import read_lines
with open('text.txt', 'w') as f:
f.write('Hello,\n\nWorld!')
lines = read_lines(path='text.txt')
print(lines)
# ['Hello,', '', 'World!']
lines = read_lines(path='text.txt', skip_empty_rows=True, encoding='utf-8')
print(lines)
# ['Hello,', 'World!']⠀Read a JSON file and return a Python list or dictionary.
⠀Accepted arguments:
path (Union[str, tuple, list])— path to the JSON fileencoding (Optional[str])— the name of the encoding used to decode or encode the file (None)
⠀Returns Union[list, dict] — the Python list or dictionary.
⠀Usage:
from pretty_utils.miscellaneous.files import write_json, read_json
users = [{'id': 33, 'username': 'username'}, {'id': 102, 'username': 'gok'}]
write_json(path='users.json', obj=users)
resp = read_json(path='users.json')
print(resp)
# [{'id': 33, 'username': 'username'}, {'id': 102, 'username': 'gok'}]⠀Get absolute path to resource, works for dev and for PyInstaller.
⠀Accepted arguments:
relative_path (str)— a relative path to the resource
⠀Returns str — an absolute path to the resource.
⠀Usage:
from pretty_utils.miscellaneous.files import resource_path
absolute_path = resource_path(relative_path='images')
print(absolute_path)
# C:\python\my_project\images⠀Functions for generating certain strings.
⠀Generate a username.
⠀Accepted arguments:
len (int)— length of a username (9)capital (bool)— capitalize the first letter (False)
⠀Returns str — the generated username.
⠀Usage:
from pretty_utils.miscellaneous import generators
username = generators.username()
print(username)
# kuganurah
username = generators.username(len=15)
print(username)
# xohosyzinehucus
username = generators.username(len=6, capital=True)
print(username)
# Asexop⠀Generate a password.
⠀Accepted arguments:
len (int)— length of a password (16)use_capitals (bool)— use capitals letters (True)use_digits (bool)— use digits (True)use_specials (bool)— use special symbols (False)
⠀Returns str — the generated password.
⠀Usage:
from pretty_utils.miscellaneous import generators
password = generators.password()
print(password)
# bz7drWwcqK3AcI2h
password = generators.password(len=8, use_digits=False)
print(password)
# FuRbgKlA
password = generators.password(len=12, use_specials=True)
print(password)
# Lx1M7ph*Ytu=⠀Functions related to sending requests via requests or aiohttp libraries.
⠀Convert requests params to aiohttp params.
⠀Accepted arguments:
params (Optional[Dict[str, Any]])— requests params
⠀Returns Optional[Dict[str, Union[str, int, float]]] — aiohttp params.
⠀Usage:
from pretty_utils.miscellaneous.http import aiohttp_params
params = {
'a': True,
'b': 1,
'c': 1.0,
'd': 'hello',
'e': 'world',
'f': None,
'g': b'agsdgha==',
'h': False,
'i': None
}
print(aiohttp_params(params))
# {
# 'a': 'true',
# 'b': 1,
# 'c': 1.0,
# 'd': 'hello',
# 'e': 'world',
# 'g': 'agsdgha==',
# 'h': 'false'
# }⠀Functions for data inputting.
⠀Ask a user to enter a string, and if he doesn't do so in a certain amount of time, return the default value. Works only in if __name__ == '__main__' construction.
⠀Accepted arguments:
prompt (str)— a prompt that will be displayed before the input requesttimeout (Union[int, float])— a timeout after which the default value will be returned (60)default_value (str)— a default value that will be returned after the timeout expires (empty string)end (str)— string appended after the last value (newline)
⠀Returns str — the inputted or default value.
⠀Usage:
from pretty_utils.miscellaneous.inputting import timeout_input
if __name__ == '__main__':
name = timeout_input(prompt='Enter your name: ', default_value='John') # Input 'Michael'
print(f'Your name is {name}.\n')
# Your name is Michael.
print('''Select the action:
1) Do nothing;
2) Causing rain;
3) Causing an earthquake.''')
action = timeout_input(prompt='> ', timeout=5, default_value='1') # Just wait
print(f'{name}, you select {action}!')
# Michael, you select 1!⠀It's a class that simplifies working with the Selenium library.
⠀Initializes a class.
⠀Accepted arguments:
browser (webdriver)— instance of WebDriver (Ie, Firefox, Chrome or Remote)
⠀Usage:
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)⠀Explicit waits of an element appearing.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage:
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
element = sel.get_element('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
browser.quit()⠀Explicit waits of an element appearing and get its text.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns str — the parsed text.
⠀Usage:
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
text = sel.get_text('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]')
print(text)
# Settings
browser.quit()⠀Waiting for an element to become clickable.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage:
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
element = sel.wait_for_clickability('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
browser.quit()⠀Waiting for an element to become visible.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage:
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
element = sel.wait_for_visibility('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
browser.quit()⠀Explicit waits of an element appearing and clear its contents.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage:
import time
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
sel.write('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input', 'google')
time.sleep(5)
element = sel.clear('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
time.sleep(5)
browser.quit()⠀Explicit waits of an element appearing and write a text to it.
⠀Accepted arguments:
find_it (str)— a string to search for the elementtext (str)— a text to writesec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)clear (bool)— clear the element before writing (True)
⠀Returns WebElement — the founded element.
⠀Usage:
import time
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
sel.write('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input', 'google')
time.sleep(5)
element = sel.write('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input', 'google')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
time.sleep(5)
browser.quit()⠀Explicit waits of an element appearing and click it.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage:
import time
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
sel.click('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]')
sel.wait_for_clickability('//*[@id="lb"]/div/g-menu/g-menu-item[1]/div')
element = sel.click('//*[@id="lb"]/div/g-menu/g-menu-item[1]/div')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
time.sleep(5)
browser.quit()⠀Explicit waits of an element appearing and click it using JS script. Use it if simple click has no effect.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage similar to that in the click function.
⠀Explicit waits of an element appearing and click it when clickable.
⠀Accepted arguments:
find_it (str)— a string to search for the elementsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)
⠀Returns WebElement — the founded element.
⠀Usage similar to that in the click function.
⠀Explicit waits of an element appearing and click it via coordinates.
⠀Accepted arguments:
find_it (Union[str, WebElement])— a string or WebElement to interactsec (int)— the element waiting time (10)by (str)— find the element by ... (XPATH)x_off (int)— x coordinate (1)y_off (int)— y coordinate (1)
⠀Returns WebElement — the founded element.
⠀Usage:
import time
from pretty_utils.miscellaneous.selenium_ import Sel
from selenium import webdriver
browser = webdriver.Chrome()
sel = Sel(browser)
browser.get('https://www.google.com/')
sel.click_with_coord('/html/body/div[1]/div[5]/div[2]/div[3]/span/span/g-popup/div[1]', x_off=10, y_off=5)
time.sleep(5)
element = sel.click_when_clicable('//*[@id="lb"]/div/g-menu/g-menu-item[1]/div')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="...", element="...")>
time.sleep(5)
browser.quit()⠀Functions for working with time and date.
⠀Convert string time to unix.
⠀Accepted arguments:
strtime (str)— a string timeutc_offset (int)— hour offset from UTC (0)format (str)— format for string time parsing (%d.%m.%Y %H:%M)
⠀Returns int — the unix time.
⠀Usage:
from pretty_utils.miscellaneous.time_and_date import strtime_to_unix
str_time = '27.06.2022 12:35'
print(strtime_to_unix(strtime=str_time, utc_offset=0)) # 12:35 UTC
# 1656333300
print(strtime_to_unix(strtime=str_time, utc_offset=-4)) # 16:35 UTC
# 1656347700
print(strtime_to_unix(strtime=str_time, utc_offset=3)) # 09:35 UTC
# 1656322500⠀Convert unix to string time. In particular return the current time.
⠀Accepted arguments:
unix_time (Union[int, float, str])— a unix time (current)utc_offset (int)— hour offset from UTC (None)format (str)— format for string time output (%d.%m.%Y %H:%M)
⠀Returns str — the string time.
⠀Usage:
from pretty_utils.miscellaneous.time_and_date import unix_to_strtime
print(unix_to_strtime(unix_time=1665831600)) # 11:00 UTC
# 15.10.2022 11:00:00
print(unix_to_strtime(unix_time=1665831600.0, utc_offset=2)) # 11:00 -> 13:00 UTC+2
# 15.10.2022 13:00:00
print(unix_to_strtime(unix_time='1665831600', utc_offset=-4)) # 11:00 -> 07:00 UTC-4
# 15.10.2022 07:00:00
print(unix_to_strtime(utc_offset=3, format="%d.%m.%Y %H:%M"))
# 15.10.2022 16:34⠀Functions for working with certain Build-in Python data types.
⠀Functions for working with bool data type.
⠀Returns a random bool.
⠀Usage:
from pretty_utils.type_functions.bools import randbool
print(randbool())
# True
print(randbool())
# False⠀Classes with various implemented functions to be inherited by other classes.
⠀A class that can be assigned arbitrary attributes.
⠀Usage:
from pretty_utils.type_functions.classes import ArbitraryAttributes
instance_1 = ArbitraryAttributes(one=1, two=2)
instance_2 = ArbitraryAttributes(str_='str', float_='float')
print(instance_1.two, instance_2.str_, instance_1.one, instance_2.float_)
# 2 str 1 float⠀Contains a __repr__ function that automatically builds the output of a class using all its variables.
⠀Usage:
from pretty_utils.type_functions.classes import AutoRepr
class UnreadablePerson:
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
class ReadablePerson(AutoRepr):
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
person = UnreadablePerson(name='John', age=32)
print(person)
# <__main__.UnreadablePerson object at 0x...>
person = ReadablePerson(name='John', age=32)
print(person)
# ReadablePerson(name='John', age=32)⠀A class that implements the singleton pattern.
⠀Usage:
from pretty_utils.type_functions.classes import AutoRepr, Singleton
class SettingsS(Singleton):
def __init__(self, a: int):
self.a = a
class SettingsSA(Singleton, AutoRepr):
def __init__(self, a: int):
self.a = a
class Settings:
def __init__(self, a: int):
self.a = a
settings_s = SettingsS(a=1)
print(id(settings_s), settings_s.a, settings_s)
# 1622951686000 1 <__main__.SettingsS object at 0x00000179DF756F70>
settings_s = SettingsS(a=2)
print(id(settings_s), settings_s.a, settings_s)
# 1622951686000 2 <__main__.SettingsS object at 0x00000179DF756F70>
settings_sa = SettingsSA(a=1)
print(id(settings_sa), settings_sa)
# 1622951752704 SettingsSA(a=1)
settings_sa = SettingsSA(a=2)
print(id(settings_sa), settings_sa)
# 1622951752704 SettingsSA(a=2)
settings = Settings(a=1)
print(id(settings), settings.a, settings)
# 1622951753664 1 <__main__.Settings object at 0x00000179DF7677C0>
settings = Settings(a=2)
print(id(settings), settings.a, settings)
# 1622951753712 2 <__main__.Settings object at 0x00000179DF7677F0>⠀A class that implements the singleton pattern with the threading lock.
⠀Usage similar to that in the Singleton function.
⠀A class that implements the singleton pattern with the multiprocessing lock.
⠀Usage similar to that in the Singleton function.
⠀A class that implements the singleton pattern with the asyncio lock.
⠀Usage similar to that in the Singleton function.
⠀Functions for working with dict data type.
⠀Update the specified dictionary with any number of dictionary attachments based on the template without changing the values already set.
⠀Accepted arguments:
modifiable (dict)— a dictionary for template-based modificationtemplate (dict)— the dictionary-templaterearrange (bool)— make the order of the keys as in the template, and place the extra keys at the end (True)remove_extra_keys (bool)— whether to remove unnecessary keys and their values (False)
⠀Returns dict — the modified dictionary.
⠀Usage:
from pretty_utils.type_functions.dicts import update_dict
a = {
'custom': 'world', # extra key
'bool': True,
'list': [0, 1, 2, 3], # edited list
'float': 10.4,
'dict': {
'bool': False, # edited bool
'dict': {
'list': [0, 3], # edited list
'custom': 'bye', # extra key
'int': 10
}
}
}
b = {
'bool': True,
'dict': {
'bool': True,
'dict': {
'int': 10,
'list': [0, 1, 2, 3]
}
},
'float': 10.4,
'int': 100,
'list': [0, 1],
'str': 'hello'
}
print(update_dict(modifiable=a, template=b))
# {
# 'bool': True,
# 'dict': {
# 'bool': False,
# 'dict': {
# 'int': 10,
# 'list': [0, 3],
# 'custom': 'bye'
# }
# },
# 'float': 10.4,
# 'int': 100,
# 'list': [0, 1, 2, 3],
# 'str': 'hello',
# 'custom': 'world'
# }
print(update_dict(modifiable=a, template=b, rearrange=False))
# {
# 'custom': 'world',
# 'bool': True,
# 'list': [0, 1, 2, 3],
# 'float': 10.4,
# 'dict': {
# 'bool': False,
# 'dict': {
# 'list': [0, 3],
# 'custom': 'bye',
# 'int': 10
# }
# },
# 'int': 100,
# 'str': 'hello'
# }
print(update_dict(modifiable=a, template=b, rearrange=False, remove_extra_keys=True))
# {
# 'bool': True,
# 'list': [0, 1, 2, 3],
# 'float': 10.4,
# 'dict': {
# 'bool': False,
# 'dict': {
# 'list': [0, 3],
# 'int': 10
# }
# },
# 'int': 100,
# 'str': 'hello'
# }⠀Functions for working with float data type.
⠀Return a random float from the range.
⠀Accepted arguments:
from_ (Union[int, float])— the minimum valueto_ (Union[int, float])— the maximum valuestep (Union[int, float])— the step size (calculated based on the number of decimal places)
⠀Returns float — the random float.
⠀Usage:
from pretty_utils.type_functions.floats import randfloat
print(randfloat(5.3, 6.2))
# 5.3
print(randfloat(1.05, 1.1))
# 1.07
print(randfloat(0.6, 1.7, 0.3))
# 1.5
print(randfloat(0.6, 0.7, 0.02))
# 0.7⠀Return a float range.
⠀Accepted arguments:
from_ (Union[int, float])— a range start valueto_ (Union[int, float])— the range stop value, not includedstep (Union[int, float])— the step size (calculated based on the number of decimal places)
⠀Returns list — the range list.
⠀Usage:
from pretty_utils.type_functions.floats import float_range
print(float_range(5.3, 6.2))
# [5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1]
print(float_range(1.05, 1.1))
# [1.05, 1.06, 1.07, 1.08, 1.09]
print(float_range(0.6, 1.7, 0.3))
# [0.6, 0.9, 1.2, 1.5]
print(float_range(0.6, 0.7, 0.02))
# [0.6, 0.62, 0.64, 0.66, 0.68]
print(float_range(7.25, 6.91, -0.05))
# [7.25, 7.2, 7.15, 7.1, 7.05, 7.0, 6.95]⠀Round down a float number.
⠀Accepted arguments:
n (float)— the float numberdecimals (int)— the decimals
⠀Returns float — rounded down the float number.
⠀Usage:
from pretty_utils.type_functions.floats import round_down
print(round_down(5.232235, 3))
# 5.232
print(round_down(1.05, 1))
# 1.0
print(round_down(0.6))
# 0.0
print(round_down(17.128, -1))
# 10.0
print(round_down(1159, -2))
# 1100.0⠀Round up a float number.
⠀Accepted arguments:
n (float)— the float numberdecimals (int)— the decimals
⠀Returns float — rounded up the float number.
⠀Usage:
from pretty_utils.type_functions.floats import round_up
print(round_up(5.232235, 3))
# 5.233
print(round_up(1.05, 1))
# 1.1
print(round_up(0.6))
# 1.0
print(round_up(17.128, -1))
# 20.0
print(round_up(1159, -2))
# 1200.0⠀Functions for working with list data type.
⠀Split a list to several lists.
⠀Accepted arguments:
s_list (list)— a list to splitn (int)— split the list into parts of N elements (100)parts (bool)— split the list into N parts (False)
⠀Returns list — the split list.
⠀Usage:
from pretty_utils.type_functions.lists import split_list
l = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]
for sl in split_list(l, 2):
print(sl)
# [[1, 2], [3, 4]]
# [[5, 6], [7, 8]]
# [[9, 10], [11, 12]]
print()
for sl in split_list(l, 2, True):
print(sl)
# [[1, 2], [3, 4], [5, 6]]
# [[7, 8], [9, 10], [11, 12]]⠀Replace all None in a list with 0.
⠀Accepted arguments:
r_list (list)— a list to replace
⠀Returns list — the processed list.
⠀Usage:
from pretty_utils.type_functions.lists import replace_to_null
print(replace_to_null([22, None, 84, None, None, 1, 0]))
# [22, 0, 84, 0, 0, 1, 0]⠀Functions for working with str data type.
⠀Extract a text between strings.
⠀Accepted arguments:
text (str)— a source textbegin (str)— a string from the end of which to start the extractionend (str)— a string at the beginning of which the extraction should end
⠀Returns str — the extracted text or empty string if nothing is found.
⠀Usage:
from pretty_utils.type_functions.strings import text_between
text = '''
Well done is better than well said.
Save when you can and not when you have to.
Don't slay dragons that aren't in your way.
'''
print(text_between(text, 'when ', ' slay') + '\n---')
# you can and not when you have to.
# Don't
# ---
print(text_between(text, end='when') + '\n---')
#
# Well done is better than well said.
# Save
# ---
print(text_between(text, 'dragons ') + '\n---')
# that aren't in your way.
#
# ---
print(text_between(text, 'another') + '\n---')
#
# ---
print(text_between(text, 'you ', ' you'))
# can and not when⠀Delete whitespaces.
⠀Accepted arguments:
text (str)— a source text
⠀Returns str — the text without whitespaces.
⠀Usage:
from pretty_utils.type_functions.strings import del_ws
text = 'Well done is better than well said.'
print(del_ws(text))
# Welldoneisbetterthanwellsaid.⠀Return formatted number like 3 392 233.9420.
⠀Accepted arguments:
number (Union[int, float])— a number for formatting
⠀Returns str — the formatted number.
⠀Usage:
from pretty_utils.type_functions.strings import format_number
print(format_number(14_386_730))
# 14 386 730
print(format_number(8401.6047))
# 8 401.6047
print(format_number(24_801_302.0192, thousands_separator=','))
# 24,801,302.0192
print(format_number(1_000_922.3905, thousands_separator="'"))
# 1'000'922.3905⠀If you found a bug or have an idea, go to the link, select the template, fill it out and submit it.
⠀You can express your gratitude to the developer by sending fund to crypto wallets!
- Address of EVM networks (Ethereum, Polygon, BSC, etc.):
0x900649087b8D7b9f799F880427DacCF2286D8F20 - USDT TRC-20:
TNpBdjcmR5KzMVCBJTRYMJp16gCkQHu84K - SOL:
DoZpXzGj5rEZVhEVzYdtwpzbXR8ifk5bajHybAmZvR4H - BTC:
bc1qs4a0c3fntlhzn9j297qdsh3splcju54xscjstc