Python 3.12 Standard Library Bible



Binary Data Services

array - Efficient arrays of numeric values.md

array - Efficient arrays of numeric values

The array module in Python provides a way to handle homogeneous sequences of numbers efficiently. This is particularly useful when you need to work with large collections of numerical data and need to perform fast operations on them.

Here are comprehensive code examples for various functionalities provided by the array module:

1. Creating Arrays

Example: Create an array of integers

import array as arr

# Create an array of integers
int_array = arr.array('i', [1, 2, 3, 4, 5])
print("Integer Array:", int_array)

Example: Create an array of floats

import array as arr

# Create an array of floats
float_array = arr.array('f', [1.1, 2.2, 3.3, 4.4, 5.5])
print("Float Array:", float_array)

2. Accessing Elements

Example: Accessing elements by index

import array as arr

# Access an element from the array
int_array = arr.array('i', [10, 20, 30, 40, 50])
print("Element at index 2:", int_array[2])  # Output: 30

Example: Accessing elements with out of bounds

import array as arr

try:
    int_array = arr.array('i', [10, 20, 30])
    print("Element at index -1:", int_array[-1])  # Output: 30
    print("Element at index 5:", int_array[5])   # Raises IndexError
except IndexError as e:
    print(e)

3. Modifying Elements

Example: Modifying an element by index

import array as arr

# Modify an element in the array
int_array = arr.array('i', [1, 2, 3, 4, 5])
int_array[2] = 10
print("Modified Integer Array:", int_array)

4. Appending Elements

Example: Appending a single element

import array as arr

# Append a single element to the array
int_array = arr.array('i', [1, 2, 3])
int_array.append(4)
print("Array after appending 4:", int_array)

Example: Extending with multiple elements

import array as arr

# Extend the array with another array
int_array = arr.array('i', [1, 2, 3])
other_int_array = arr.array('i', [4, 5, 6])
int_array.extend(other_int_array)
print("Array after extending:", int_array)

5. Operations on Arrays

Example: Adding elements using a loop

import array as arr

# Create an empty integer array and add elements
int_array = arr.array('i')
for i in range(10):
    int_array.append(i * 2)
print("Array after adding elements with a loop:", int_array)

Example: Sorting the array

import array as arr

# Sort an array
int_array = arr.array('i', [5, 3, 9, 1, 6])
int_array.sort()
print("Sorted Integer Array:", int_array)

6. Converting Arrays to Lists

Example: Convert array to a list

import array as arr

# Convert an array to a list
int_array = arr.array('i', [1, 2, 3])
list_array = int_array.tolist()
print("Array converted to list:", list_array)

7. Concatenating Arrays

Example: Concatenating two arrays

import array as arr

# Concatenate two integer arrays
int_array1 = arr.array('i', [1, 2, 3])
int_array2 = arr.array('i', [4, 5, 6])
concatenated_array = int_array1 + int_array2
print("Concatenated Integer Array:", concatenated_array)

8. Reversing an Array

Example: Reversing the array

import array as arr

# Reverse an integer array
int_array = arr.array('i', [7, 8, 9])
reversed_array = int_array[::-1]
print("Reversed Integer Array:", reversed_array)

9. Indexing with Negative Numbers

Example: Accessing elements using negative indices

import array as arr

# Access elements using negative indices
int_array = arr.array('i', [10, 20, 30])
print("Element at index -1:", int_array[-1])  # Output: 30
print("Element at index -2:", int_array[-2])  # Output: 20

10. Iterating Over Arrays

Example: Iterating over an array using a for loop

import array as arr

# Iterate over an integer array
int_array = arr.array('i', [4, 8, 12])
for element in int_array:
    print(element)  # Output: 4, 8, 12

11. Comparing Arrays

Example: Comparing two arrays for equality

import array as arr

# Compare two integer arrays for equality
int_array1 = arr.array('i', [1, 2, 3])
int_array2 = arr.array('i', [1, 2, 3])
print("Arrays are equal:", int_array1 == int_array2)  # Output: True

12. Arithmetic Operations

Example: Adding two arrays element-wise (supported for integer and float arrays)

import array as arr

# Add two integer arrays element-wise
int_array1 = arr.array('i', [1, 2, 3])
int_array2 = arr.array('i', [4, 5, 6])
result_array = int_array1 + int_array2
print("Resulting Array after addition:", result_array)

13. String Formatting

Example: Formatting an array as a string (supported for integer and float arrays)

import array as arr

# Format an array as a string
int_array = arr.array('i', [7, 8, 9])
formatted_string = str(int_array)
print("Array formatted as string:", formatted_string)  # Output: array('i', [7, 8, 9])

These examples cover the most common functionalities of the array module. Each example is well-documented to help you understand how to use each method effectively in your Python programs.

bisect - Array bisection algorithm.md

bisect - Array bisection algorithm

The bisect module in Python provides a set of functions that perform binary search on sorted arrays. This module is particularly useful when you need to efficiently find the position where an item should be inserted into a list to maintain its sorted order.

Here are comprehensive code examples for each functionality provided by the bisect module:

Example 1: Bisection Search

import bisect

# List of numbers
numbers = [1, 3, 5, 7, 9]

# Element to search for
search_value = 6

# Find the position where the element should be inserted to maintain sorted order
insert_position = bisect.bisect_left(numbers, search_value)

print(f"The element {search_value} can be inserted at index {insert_position} to maintain the list in sorted order.")

Example 2: Bisection Search Using bisect_right or bisect

The bisect_right function is similar to bisect_left, but it returns the insertion point where the element should be inserted to maintain sorted order, ensuring that duplicates are added at the rightmost position.

import bisect

# List of numbers with duplicates
numbers = [1, 2, 2, 3, 4, 5]

# Element to search for
search_value = 2

# Find the position where the element should be inserted
insert_position_right = bisect.bisect(numbers, search_value)

print(f"The element {search_value} can be inserted at index {insert_position_right} to maintain the list in sorted order.")

Example 3: Bisection Search for Insertion

import bisect

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Element to insert
insert_value = 7

# Find the position where the element should be inserted to maintain sorted order
insert_position_insert = bisect.bisect_left(numbers, insert_value)

# Insert the element at the found position
numbers.insert(insert_position_insert, insert_value)

print(f"List after inserting {insert_value}: {numbers}")

Example 4: Bisection Search for Deletion

import bisect

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Element to delete
delete_value = 3

# Find the position where the element should be deleted
insert_position_delete = bisect.bisect_left(numbers, delete_value)

# Delete the element if it exists
if insert_position_delete < len(numbers) and numbers[insert_position_delete] == delete_value:
    del numbers[insert_position_delete]

print(f"List after deleting {delete_value}: {numbers}")

Example 5: Bisection Search with Key Function

You can also use a key function to perform the bisect operation on custom keys.

import bisect

# List of tuples where each tuple is (value, index)
tuples = [(1, 'a'), (2, 'b'), (3, 'c')]

# Element and its corresponding key for search
search_value = 3
key_func = lambda x: x[0]

# Find the position where the element should be inserted based on the key function
insert_position_key = bisect.bisect_left(tuples, (search_value, ''), key=key_func)

print(f"The element {search_value} can be inserted at index {insert_position_key} based on the key function.")

Example 6: Bisection Search for Rightmost Position

The bisect_right function is useful when you need to find the rightmost position where an element should be inserted to maintain sorted order.

import bisect

# List of numbers with duplicates
numbers = [1, 2, 2, 3, 4, 5]

# Element to search for
search_value = 2

# Find the position where the element should be inserted
insert_position_right = bisect.bisect_right(numbers, search_value)

print(f"The rightmost occurrence of {search_value} is at index {insert_position_right}.")

These examples cover various use cases of the bisect module, demonstrating its versatility in maintaining sorted lists and performing efficient binary searches.

calendar - General calendar-related functions

The calendar module in Python provides a set of functions that facilitate the display, generation, and manipulation of calendars. Here are comprehensive code examples demonstrating various functionalities within this module:

import calendar
import datetime

# Example 1: Display the current month's calendar with weekday names at the top
print("Current Month Calendar:")
print(calendar.month(2023, 9))

# Example 2: Display a specific month and year's calendar with day numbers centered
print("\nSpecific Month Calendar (Centered Day Numbers):")
calendar.setfirstweekday(calendar.MONDAY)  # Set Monday as the first day of the week
print(calendar.month(2023, 10))

# Example 3: Format a date in the ISO 8601 format
formatted_date = datetime.date(2023, 9, 5).isoformat()
print("\nFormatted Date (ISO 8601):", formatted_date)

# Example 4: Determine if a given year is a leap year
year = 2024
if calendar.isleap(year):
    print(f"{year} is a leap year.")
else:
    print(f"{year} is not a leap year.")

# Example 5: Generate the day of the week for a specific date in a month and year
day_of_week = calendar.weekday(2023, 9, 1)
weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
print(f"\nDay of Week (Monday=0): {weekdays[day_of_week]}")

# Example 6: Display the full calendar for a year
print("\nFull Calendar for Year 2023:")
full_calendar = calendar.calendar(2023)
print(full_calendar)

# Example 7: Generate a range of dates
start_date = (2023, 9, 1)
end_date = (2023, 9, 30)
cal_range = calendar.monthrange(start_date[0], start_date[1])
first_weekday_of_month = cal_range[0]
num_days_in_month = cal_range[1]

print(f"\nNumber of days in the month: {num_days_in_month}")
for day in range(1, num_days_in_month + 1):
    print(calendar.day_name[(first_weekday_of_month + day - 1) % 7])

# Example 8: Generate a list of holidays (placeholder, as Python's calendar module does not support holidays)
holidays = ["2023-01-01 New Year's Day", "2023-12-25 Christmas Day"]
print("\nHolidays in Year 2023:")
for holiday in holidays:
    print(holiday)

# Example 9: Format the month with weekend days highlighted
highlight_weekends = calendar.monthcalendar(2023, 10)
print("\nMonth Calendar with Weekends Highlighted:")
for week in highlight_weekends:
    for day in week:
        if day == 6 or day == 7:  # Saturday and Sunday
            print("*", end=" ")
        else:
            print(day, end=" ")
    print()

# Example 10: Generate a list of all days in a year
days_of_year = calendar.Calendar().yeardays2calendar(2023)
print("\nDays of the Year for Year 2023:")
for week_list in days_of_year:
    for week in week_list:
        for day in week:
            print(day, end=" ")
    print()

Explanation:

  1. Current Month Calendar: Displays the current month's calendar with weekday names at the top.
  2. Specific Month Calendar (Centered Day Numbers): Demonstrates displaying a specific month and year's calendar with centered day numbers.
  3. Formatted Date (ISO 8601): Shows how to format a date in the ISO 8601 format.
  4. Leap Year Check: Determines if a given year is a leap year using the isleap function.
  5. Day of the Week: Finds and prints the day of the week for a specific date in a month and year.
  6. Full Calendar for Year: Displays the full calendar for a specified year.
  7. Generate a Range of Dates: Shows how to generate a range of dates from a start to an end date.
  8. Holidays in Year: Lists all holidays for a given year using the holidays function.
  9. Month Calendar with Weekends Highlighted: Highlights Saturday and Sunday in a month's calendar.
  10. Days of the Year: Displays all days in a year in a structured format.

These examples cover various aspects of the calendar module, from basic calendaring functions to more advanced date manipulation techniques.

codecs - Codec registry and base classes.md

codecs - Codec registry and base classes

The codecs module in Python provides a comprehensive set of tools for handling different character encodings, including converting between different character encodings, decoding raw bytes into strings, and encoding strings back into raw bytes. Below are several code examples demonstrating various functionalities within the codecs module:

Example 1: Encoding and Decoding Strings

import codecs

# Define a string in UTF-8 encoding
original_string = "Hello, World!"

# Encode the string to bytes using UTF-8 encoding
encoded_bytes = original_string.encode('utf-8')
print(f"Original String: {original_string}")
print(f"Encoded Bytes: {encoded_bytes}")

# Decode the bytes back to a string using UTF-8 decoding
decoded_string = encoded_bytes.decode('utf-8')
print(f"Decoded String: {decoded_string}")

Explanation: This example demonstrates how to encode and decode strings between UTF-8 encoding. The encode method converts the string into bytes, and the decode method converts bytes back into a string.

Example 2: Handling Non-Breaking Spaces

import codecs

# Define a string with non-breaking spaces
non_breaking_string = "Hello,\xa0World!"

# Decode the string using UTF-8 decoding to handle non-breakable spaces
decoded_string = non_breaking_string.decode('utf-8')
print(f"Decoded String: {decoded_string}")

Explanation: This example shows how to handle strings with non-breaking spaces. The decode method automatically handles these special characters when decoding from UTF-8.

Example 3: Encoding with Different Encodings

import codecs

# Define a string in ASCII encoding
ascii_string = "Hello, World!"

# Encode the string to bytes using ASCII encoding
encoded_bytes_ascii = ascii_string.encode('ascii')
print(f"Encoded Bytes (ASCII): {encoded_bytes_ascii}")

# Define another string in ISO-8859-1 encoding
iso_string = "Cafรฉ"

# Encode the string to bytes using ISO-8859-1 encoding
encoded_bytes_iso = iso_string.encode('iso-8859-1')
print(f"Encoded Bytes (ISO-8859-1): {encoded_bytes_iso}")

Explanation: This example demonstrates how to encode strings in different character encodings, such as ASCII and ISO-8859-1. The encode method converts the string into bytes using the specified encoding.

Example 4: Using Codec Aliases

import codecs

# Define a string in UTF-8 encoding
original_string = "Hello, World!"

# Encode the string to bytes using the alias 'utf-8'
encoded_bytes_alias = original_string.encode('utf-8')
print(f"Encoded Bytes (Alias): {encoded_bytes_alias}")

Explanation: This example shows how to use codec aliases to specify an encoding by its alias name. The encode method uses the specified alias to encode the string into bytes.

Example 5: Handling Unicode Characters

import codecs

# Define a string containing a Unicode character
unicode_string = "Hello, ๐ŸŒ!"

# Encode the string to bytes using UTF-8 encoding
encoded_bytes_unicode = unicode_string.encode('utf-8')
print(f"Encoded Bytes (Unicode): {encoded_bytes_unicode}")

# Decode the bytes back to a string using UTF-8 decoding
decoded_string_unicode = encoded_bytes_unicode.decode('utf-8')
print(f"Decoded String (Unicode): {decoded_string_unicode}")

Explanation: This example demonstrates how to handle Unicode characters in strings. The encode method converts the string into bytes, and the decode method converts bytes back into a string, preserving the Unicode representation.

Example 6: Error Handling during Encoding and Decoding

import codecs

# Define a string containing a character that cannot be encoded with ASCII
non_ascii_string = "Hello, ๐Ÿ˜Š!"

try:
    # Attempt to encode the string using ASCII encoding (this will raise an error)
    encoded_bytes_error = non_ascii_string.encode('ascii')
except UnicodeEncodeError as e:
    print(f"Encoding Error: {e}")

# Define a string containing a character that cannot be decoded with UTF-8
unicode_non_decodable_string = "Hello, ๐ŸŒ!"

try:
    # Attempt to decode the bytes using UTF-8 decoding (this will raise an error)
    decoded_string_error = unicode_non_decodable_string.decode('utf-8')
except UnicodeDecodeError as e:
    print(f"Decoding Error: {e}")

Explanation: This example demonstrates how to handle errors during encoding and decoding operations. The encode method raises a UnicodeEncodeError if it encounters a character that cannot be encoded, and the decode method raises a UnicodeDecodeError if it encounters an invalid byte sequence.

Example 7: Using codecs.open for File Handling

import codecs

# Define a string to write to a file using UTF-8 encoding
write_string = "Hello, World!"

# Open a file for writing and encode the string using UTF-8 encoding
with codecs.open('output.txt', 'w', encoding='utf-8') as file:
    file.write(write_string)

# Read the file back and decode it to a string using UTF-8 decoding
with codecs.open('output.txt', 'r', encoding='utf-8') as file:
    read_string = file.read()
    print(f"Read String: {read_string}")

Explanation: This example demonstrates how to use codecs.open for file handling. It writes a string to a file and then reads it back, both using UTF-8 encoding.

Example 8: Using codecs.iterencode and codecs.iterdecode

import codecs

# Define a list of Unicode characters
unicode_chars = ['Hello', 'World', '!']

# Encode each character in the list using UTF-8 encoding
encoded_iter = codecs.iterencode(unicode_chars, 'utf-8')
for encoded_bytes in encoded_iter:
    print(f"Encoded Bytes: {encoded_bytes}")

# Decode each byte sequence back to a string using UTF-8 decoding
decoded_iter = codecs.iterdecode(encoded_iter, 'utf-8')
for decoded_string in decoded_iter:
    print(f"Decoded String: {decoded_string}")

Explanation: This example demonstrates how to use codecs.iterencode and codecs.iterdecode for encoding and decoding multiple strings efficiently. These functions are useful when dealing with sequences of characters.

These examples cover a range of functionalities within the codecs module, including basic encoding/decoding operations, handling special characters, using codec aliases, handling Unicode characters, error handling, file handling with codecs.open, and more.

collections - Container datatypes.md

collections - Container datatypes

Collections Module Examples

The collections module in Python provides a collection of container data types that are implemented as subclasses of built-in types, often making them more efficient or convenient for specific use cases. Here are comprehensive examples of each data type available in the collections module:


1. Counter

Description: A dictionary subclass for counting hashable objects. Elements are stored as dictionary keys and their counts are stored as dictionary values.

Example:

from collections import Counter

# Example with a list of words
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_counts = Counter(words)
print(word_counts)  # Output: Counter({'apple': 3, 'banana': 2, 'orange': 1})

# Example with a string
char_counts = Counter("hello world")
print(char_counts)  # Output: Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

# Example with a dictionary
dict_counts = Counter({'a': 1, 'b': 2, 'c': 1})
print(dict_counts)  # Output: Counter({'b': 2, 'a': 1, 'c': 1})

Explanation: - The Counter class is used to count the occurrences of each element in a list or any iterable. - It provides methods like .most_common(n) to get the n most common elements and their counts.


2. OrderedDict

Description: An ordered dictionary that remembers the order in which its contents are added. This is useful when you need to maintain the insertion order of keys.

Example:

from collections import OrderedDict

# Example with an ordered dictionary
ordered_dict = OrderedDict()
ordered_dict['apple'] = 1
ordered_dict['banana'] = 2
ordered_dict['orange'] = 3
print(ordered_dict)  # Output: OrderedDict([('apple', 1), ('banana', 2), ('orange', 3)])

# Example with a dictionary and sorting
regular_dict = {'banana': 2, 'apple': 1, 'orange': 3}
ordered_dict = OrderedDict(sorted(regular_dict.items()))
print(ordered_dict)  # Output: OrderedDict([('apple', 1), ('banana', 2), ('orange', 3)])

Explanation: - The OrderedDict class maintains the insertion order of its elements, which is not guaranteed by regular dictionaries. - This can be useful in scenarios where maintaining order is important, such as caching or certain types of configurations.


3. defaultdict

Description: A dictionary subclass that calls a factory function to provide missing values.

Example:

from collections import defaultdict

# Example with a defaultdict to count even and odd numbers
count_dict = defaultdict(list)
for number in range(10):
    if number % 2 == 0:
        count_dict['even'].append(number)
    else:
        count_dict['odd'].append(number)

print(count_dict)  # Output: defaultdict(<class 'list'>, {'even': [0, 2, 4, 6, 8], 'odd': [1, 3, 5, 7, 9]})

# Example with a defaultdict and a custom factory function
def default_factory():
    return "default value"

custom_dict = defaultdict(default_factory)
print(custom_dict["missing_key"])  # Output: default value

Explanation: - The defaultdict class is used to initialize dictionary values automatically. - In this example, it initializes a list for each key that does not already exist in the dictionary.


4. namedtuple

Description: A factory function returning a new tuple subclass with named fields.

Example:

from collections import namedtuple

# Example with a named tuple to represent a point in 2D space
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(1, 2)
p2 = Point(x=3, y=4)

print(p1)  # Output: Point(x=1, y=2)
print(p2)  # Output: Point(x=3, y=4)

# Example with a named tuple to represent a person
Person = namedtuple('Person', ['name', 'age'])
person = Person(name="Alice", age=30)

print(person)  # Output: Person(name='Alice', age=30)
print(person.name)  # Output: Alice
print(person.age)  # Output: 30

Explanation: - The namedtuple function creates a subclass of tuple with named fields. - This makes the tuple more readable and convenient for representing objects with specific attributes.


5. deque

Description: A double-ended queue (deque) which supports efficient appends and pops from both ends.

Example:

from collections import deque

# Example with a deque to implement a simple stack
stack = deque()
stack.append(1)
stack.append(2)
stack.appendleft(3)

print(stack)  # Output: deque([3, 1, 2])
print(stack.pop())  # Output: 2
print(stack.popleft())  # Output: 3

# Example with a deque to implement a queue
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)

print(queue)  # Output: deque([1, 2, 3])
print(queue.popleft())  # Output: 1
print(queue)  # Output: deque([2, 3])

Explanation: - The deque class is an optimized list for fast appends and pops from both ends. - This is useful in scenarios where you need a dynamic array that supports efficient push and pop operations on both sides.


6. ChainMap

Description: A collection which provides a way to group multiple mappings as if they were one, but which does not actually merge them.

Example:

from collections import ChainMap

# Example with chain maps for combining multiple dictionaries
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined_dict = ChainMap(dict1, dict2)
print(combined_dict)  # Output: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})

# Example with chain maps and updating values
dict1['a'] = 5
print(combined_dict)  # Output: ChainMap({'a': 5, 'b': 2}, {'b': 3, 'c': 4})

Explanation: - The ChainMap class allows you to create a new dictionary that combines multiple dictionaries. - It will prioritize the first dictionary when retrieving values for keys that exist in more than one.


7. UserDict

Description: A subclass of dict providing a base class for dictionary subclasses.

Example:

from collections import UserDict

# Example with a user-defined dictionary subclass
class MyDict(UserDict):
    def __missing__(self, key):
        # Custom behavior when an item is missing
        return f"Key {key} not found"

my_dict = MyDict()
my_dict['name'] = 'Alice'
print(my_dict)  # Output: {'name': 'Alice'}
print(my_dict['age'])  # Output: Key age not found

# Example with a user-defined dictionary subclass and custom initialization
class MyDictWithInit(UserDict):
    def __init__(self, initial_data):
        super().__init__(initial_data)
        self.custom_attribute = 'custom_value'

my_dict_with_init = MyDictWithInit({'key1': 'value1'})
print(my_dict_with_init)  # Output: {'key1': 'value1'}
print(my_dict_with_init.custom_attribute)  # Output: custom_value

Explanation: - The UserDict class allows you to create a custom dictionary subclass with additional behavior. - It provides a method __missing__ that can be overridden to customize the behavior when a key is missing.


8. UserList

Description: A subclass of list providing a base class for list subclasses.

Example:

from collections import UserList

# Example with a user-defined list subclass
class MyList(UserList):
    def __init__(self, iterable=()):
        # Custom initialization behavior
        super().__init__(iterable)
        self.custom_attribute = 'hello'

my_list = MyList([1, 2, 3])
print(my_list)  # Output: [1, 2, 3]
print(my_list.custom_attribute)  # Output: hello

# Example with a user-defined list subclass and custom method
class MyListWithMethod(UserList):
    def custom_method(self):
        return sum(self)

my_list_with_method = MyListWithMethod([1, 2, 3])
print(my_list_with_method)  # Output: [1, 2, 3]
print(my_list_with_method.custom_method())  # Output: 6

Explanation: - The UserList class allows you to create a custom list subclass with additional behavior. - It provides a method __init__ that can be overridden to customize initialization.


9. UserString

Description: A subclass of str providing a base class for string subclasses.

Example:

from collections import UserString

# Example with a user-defined string subclass
class MyString(UserString):
    def __init__(self, data=''):
        # Custom initialization behavior
        super().__init__(data)
        self.custom_attribute = 'world'

my_string = MyString('hello')
print(my_string)  # Output: hello
print(my_string.custom_attribute)  # Output: world

# Example with a user-defined string subclass and custom method
class MyStringWithMethod(UserString):
    def custom_method(self):
        return self.data.upper()

my_string_with_method = MyStringWithMethod('hello')
print(my_string_with_method)  # Output: hello
print(my_string_with_method.custom_method())  # Output: HELLO

Explanation: - The UserString class allows you to create a custom string subclass with additional behavior. - It provides a method __init__ that can be overridden to customize initialization.


These examples demonstrate various functionalities of the collections module, from basic counting to more advanced data structures like OrderedDict and deque. These classes are designed to improve performance and readability in Python applications.

collections.abc - Abstract Base Classes for Containers.md

collections.abc - Abstract Base Classes for Containers

Below are comprehensive examples of how to use the collections.abc module, which provides abstract base classes for various container types like sequences and mappings.

1. Sequence ABC

Example: Implementing a Custom Sequence

from collections.abc import Sequence

class MyList(Sequence):
    def __init__(self, elements):
        self._elements = list(elements)

    def __getitem__(self, index):
        return self._elements[index]

    def __len__(self):
        return len(self._elements)

# Usage
my_list = MyList([1, 2, 3, 4, 5])
print(list(my_list))  # Output: [1, 2, 3, 4, 5]
print(len(my_list))    # Output: 5

2. Mapping ABC

Example: Implementing a Custom Dictionary

from collections.abc import Mapping

class MyDict(Mapping):
    def __init__(self, key_value_pairs):
        self._data = dict(key_value_pairs)

    def __getitem__(self, key):
        return self._data[key]

    def __len__(self):
        return len(self._data)

    def keys(self):
        return iter(self._data.keys())

    def values(self):
        return iter(self._data.values())

# Usage
my_dict = MyDict({'a': 1, 'b': 2, 'c': 3})
print(my_dict['a'])     # Output: 1
print(len(my_dict))       # Output: 3
for key in my_dict:
    print(key)             # Output: a b c

3. Mutable Sequence ABC

Example: Implementing a Custom Mutable List

from collections.abc import MutableSequence

class MyMutableList(MutableSequence):
    def __init__(self, elements=None):
        self._elements = list(elements) if elements is not None else []

    def insert(self, index, element):
        self._elements.insert(index, element)

    def __getitem__(self, index):
        return self._elements[index]

    def __delitem__(self, index):
        del self._elements[index]

    def __len__(self):
        return len(self._elements)

# Usage
my_list = MyMutableList([1, 2, 3])
print(my_list)     # Output: [1, 2, 3]
my_list.insert(1, 4)
print(my_list)     # Output: [1, 4, 2, 3]
del my_list[1]
print(my_list)     # Output: [1, 2, 3]

4. Mutable Mapping ABC

Example: Implementing a Custom Mutable Dictionary

from collections.abc import MutableMapping

class MyMutableDict(MutableMapping):
    def __init__(self, key_value_pairs=None):
        self._data = dict(key_value_pairs) if key_value_pairs is not None else {}

    def __getitem__(self, key):
        return self._data[key]

    def __setitem__(self, key, value):
        self._data[key] = value

    def __delitem__(self, key):
        del self._data[key]

    def __len__(self):
        return len(self._data)

    def keys(self):
        return iter(self._data.keys())

    def values(self):
        return iter(self._data.values())

# Usage
my_dict = MyMutableDict({'a': 1, 'b': 2})
print(my_dict)           # Output: {'a': 1, 'b': 2}
my_dict['c'] = 3
print(my_dict)           # Output: {'a': 1, 'b': 2, 'c': 3}
del my_dict['a']
print(my_dict)           # Output: {'b': 2, 'c': 3}

5. Set ABC

Example: Implementing a Custom Set

from collections.abc import Set

class MySet(Set):
    def __init__(self, elements=None):
        self._elements = set(elements) if elements is not None else set()

    def add(self, element):
        self._elements.add(element)

    def remove(self, element):
        self._elements.remove(element)

    def __contains__(self, element):
        return element in self._elements

    def __len__(self):
        return len(self._elements)

# Usage
my_set = MySet([1, 2, 3])
print(1 in my_set)      # Output: True
my_set.add(4)
print(4 in my_set)      # Output: True
my_set.remove(1)
print(my_set)            # Output: {2, 3, 4}

6. Deque ABC

Example: Implementing a Custom Double-Ended Queue

from collections.abc import Deque

class MyDeque(Deque):
    def appendleft(self, element):
        self._elements.appendleft(element)

    def popleft(self):
        return self._elements.popleft()

# Usage
my_deque = MyDeque()
my_deque.appendleft(1)
my_deque.appendleft(2)
print(list(my_deque))  # Output: [2, 1]
first_element = my_deque.popleft()
print(first_element)    # Output: 2

These examples demonstrate how to implement custom container types by subclassing the abstract base classes provided in collections.abc. Each example includes comments explaining the purpose of each method and demonstrates its usage.

copy - Shallow and deep copy operations.md

copy - Shallow and deep copy operations

The copy module in Python provides a variety of functions to perform shallow and deep copies on objects, which are essential for managing complex data structures. Here are comprehensive examples demonstrating how to use these functionalities:

Shallow Copy

A shallow copy creates a new object that is a copy of the original object but references the same objects as the originals. This means that changes to sub-objects in the copied object will affect the original object.

# Import the necessary module
import copy

def demonstrate_shallow_copy():
    # Example: Shallow copying a list
    original_list = [1, 2, [3, 4]]
    shallow_copied_list = copy.copy(original_list)

    print("Original List:", original_list)  # Output: Original List: [1, 2, [3, 4]]
    print("Shallow Copied List:", shallow_copied_list)  # Output: Shallow Copied List: [1, 2, [3, 4]]

    # Modifying the sub-list in the copied list
    shallow_copied_list[2][0] = 'a'

    print("Modified Original List:", original_list)  # Output: Modified Original List: [1, 2, ['a', 4]]
    print("Shallow Copied List After Modification:", shallow_copied_list)  # Output: Shallow Copied List After Modification: [1, 2, ['a', 4]]

# Call the function to demonstrate
demonstrate_shallow_copy()

Deep Copy

A deep copy creates a new object and recursively copies all sub-objects into it. This means that changes to sub-objects in the copied object will not affect the original object.

def demonstrate_deep_copy():
    # Example: Deep copying a dictionary with nested lists
    original_dict = {
        'a': 1,
        'b': [2, 3],
        'c': {'d': 4}
    }

    deep_copied_dict = copy.deepcopy(original_dict)

    print("Original Dictionary:", original_dict)  # Output: Original Dictionary: {'a': 1, 'b': [2, 3], 'c': {'d': 4}}
    print("Deep Copied Dictionary:", deep_copied_dict)  # Output: Deep Copied Dictionary: {'a': 1, 'b': [2, 3], 'c': {'d': 4}}

    # Modifying the nested list in the copied dictionary
    deep_copied_dict['b'][0] = 'x'

    print("Modified Original Dictionary:", original_dict)  # Output: Modified Original Dictionary: {'a': 1, 'b': [2, 3], 'c': {'d': 4}}
    print("Deep Copied Dictionary After Modification:", deep_copied_dict)  # Output: Deep Copied Dictionary After Modification: {'a': 1, 'b': ['x', 3], 'c': {'d': 4}}

# Call the function to demonstrate
demonstrate_deep_copy()

Explanation

These examples demonstrate how to use the copy module to perform both shallow and deep copies, highlighting their respective use cases.

Data Types.md

Data Types

The Python standard library includes several modules dedicated to handling different data types efficiently. Below are comprehensive code examples for some of these modules, focusing on their primary functionalities:

1. collections Module

This module provides specialized container datatypes that differ from built-in containers like lists and dictionaries.

Example 1: Using deque

A deque (double-ended queue) is a list-like container with fast appends and pops from either end.

from collections import deque

# Creating a deque
dq = deque([1, 2, 3])

# Appending to the right
dq.append(4)
print(dq)  # Output: deque([1, 2, 3, 4])

# Appending to the left
dq.appendleft(0)
print(dq)  # Output: deque([0, 1, 2, 3, 4])

# Popping from the right
last_element = dq.pop()
print(last_element)  # Output: 4
print(dq)  # Output: deque([0, 1, 2, 3])

# Popping from the left
first_element = dq.popleft()
print(first_element)  # Output: 0
print(dq)  # Output: deque([1, 2, 3])

Example 2: Using Counter

A Counter is a dictionary subclass for counting hashable objects.

from collections import Counter

# Creating a Counter object
counter = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'banana'])

# Displaying the count of each item
print(counter)  # Output: Counter({'banana': 3, 'apple': 2, 'orange': 1})

# Finding the most common items
most_common_items = counter.most_common(2)
print(most_common_items)  # Output: [('banana', 3), ('apple', 2)]

# Subtracting from another Counter
counter.subtract({'banana': 1})
print(counter)  # Output: Counter({'banana': 2, 'apple': 2, 'orange': 1})

2. datetime Module

This module provides classes for manipulating dates and times.

Example 1: Basic Date Manipulation

from datetime import date

# Creating a date object
today = date.today()
print(today)  # Output: YYYY-MM-DD

# Formatting the date
formatted_date = today.strftime('%Y-%m-%d')
print(formatted_date)  # Output: YYYY-MM-DD

# Adding days to a date
tomorrow = today + timedelta(days=1)
print(tomorrow)  # Output: YYYY-MM-DD

Example 2: Timezone Handling

from datetime import datetime, timezone, timedelta

# Creating a timezone-aware datetime object
aware_datetime = datetime.now(timezone.utc)
print(aware_datetime)  # Output: datetime.datetime(YYYY, MM, DD, HH, MM, SS, tzinfo=UTC)

# Converting to another timezone
local_datetime = aware_datetime.astimezone(timezone(timedelta(hours=5)))
print(local_datetime)  # Output: datetime.datetime(YYYY, MM, DD, HH, MM, SS, tzinfo=LOCAL_TIMEZONE)

3. itertools Module

This module provides various functions to create iterators for efficient looping.

Example 1: Using count

from itertools import count

# Creating an infinite counter
counter = count(start=5)

# Generating the first five numbers in the sequence
for _ in range(5):
    print(next(counter))  # Output: 5, 6, 7, 8, 9

Example 2: Using cycle

from itertools import cycle

# Creating an infinite cycle iterator
cycler = cycle(['A', 'B', 'C'])

# Generating the first ten elements in the sequence
for _ in range(10):
    print(next(cycler))  # Output: A, B, C, A, B, C, A, B, C, A

4. random Module

This module provides functions to generate random numbers and make random selections.

Example 1: Generating a Random Float

import random

# Generating a random float between 0.0 and 1.0
random_float = random.random()
print(random_float)  # Output: 0.987654321 (approximately)

Example 2: Choosing a Random Element from a List

import random

fruits = ['apple', 'banana', 'cherry']
random_fruit = random.choice(fruits)
print(random_fruit)  # Output: apple or banana or cherry randomly selected

5. math Module

This module provides mathematical functions.

Example 1: Mathematical Constants

import math

# Accessing the value of pi
pi_value = math.pi
print(pi_value)  # Output: 3.141592653589793

# Calculating the square root of a number
sqrt_2 = math.sqrt(2)
print(sqrt_2)  # Output: 1.4142135623730951

Example 2: Trigonometric Functions

import math

# Calculating the sine of an angle in radians
sin_value = math.sin(math.pi / 4)
print(sin_value)  # Output: 0.7071067811865476

6. sys Module

This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter.

Example 1: Accessing Command-Line Arguments

import sys

# List of command-line arguments (sys.argv)
print(sys.argv)  # Output: ['script_name', 'arg1', 'arg2', ...]

7. os Module

This module provides a portable way of using operating system dependent functionality.

Example 1: Listing Files in a Directory

import os

# List all files and directories in the current working directory
files_and_dirs = os.listdir('.')
print(files_and_dirs)  # Output: ['file1.txt', 'file2.txt', ...]

Example 2: Changing Current Working Directory

import os

os.chdir('/path/to/new/directory')
current_directory = os.getcwd()
print(current_directory)  # Output: /path/to/new/directory

These examples cover a range of functionalities available in the collections, datetime, itertools, math, sys, and os modules, demonstrating how to use them effectively in Python.

datetime - Basic date and time types.md

datetime - Basic date and time types

Here are comprehensive and well-documented code examples for the Python standard library module datetime, focusing on its basic date and time types.

1. Importing the datetime Module

The first step is to import the datetime module, which provides classes for manipulating dates and times.

# Import the datetime class from the datetime module
from datetime import datetime

2. Creating a Current Date and Time

You can create a current date and time using the now() method of the datetime class.

# Get the current date and time
current_datetime = datetime.now()
print("Current Date and Time:", current_datetime)

3. Formatting Dates and Times

Dates and times can be formatted using various format codes, which are similar to those used by the C strftime() function.

# Format the current date and time
formatted_date_time = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
print("Formatted Date and Time:", formatted_date_time)

4. Creating a Specific Date

You can create a specific date using the datetime class with year, month, and day arguments.

# Create a specific date
specific_date = datetime(2023, 10, 5)
print("Specific Date:", specific_date)

5. Adding and Subtracting Time

You can add or subtract time from a datetime object using the timedelta class.

# Create a timedelta of one day
one_day = datetime.timedelta(days=1)

# Add one day to the current date
future_date = current_datetime + one_day
print("Future Date:", future_date)

6. Parsing Strings into Dates

You can parse strings containing dates into datetime objects using the strptime() method.

# Parse a string into a datetime object
parsed_date_time = datetime.strptime("2023-10-05 14:30:00", "%Y-%m-%d %H:%M:%S")
print("Parsed Date and Time:", parsed_date_time)

7. Working with Time Zones

The pytz library can be used to work with time zones, but for basic usage, you can use the datetime.timezone() function.

from datetime import timezone

# Create a timezone object for UTC
utc_timezone = timezone.utc

# Get the current date and time in UTC
utc_datetime = datetime.now(utc_timezone)
print("Current Date and Time in UTC:", utc_datetime)

8. Comparing Dates and Times

Dates and times can be compared using comparison operators.

# Compare two dates
date1 = datetime(2023, 9, 5)
date2 = datetime(2023, 10, 5)

if date1 < date2:
    print("Date1 is before Date2")
elif date1 > date2:
    print("Date1 is after Date2")
else:
    print("Date1 and Date2 are the same")

9. Working with Time Periods

Time periods can be represented using timedelta objects.

# Create a timedelta of one month
one_month = datetime.timedelta(days=30)

# Add one month to the current date
future_date_with_month = current_datetime + one_month
print("Future Date with Month:", future_date_with_month)

10. Creating Time Objects

You can create time objects using the time module, which is part of the datetime module.

from datetime import time

# Create a specific time
specific_time = time(14, 30)
print("Specific Time:", specific_time)

Conclusion

These examples cover the basic functionalities of the datetime module in Python. They demonstrate how to create, manipulate, and format dates and times, as well as work with time zones and compare dates and times. These examples are suitable for both beginner and advanced users and can be used in a variety of applications involving date and time handling.

enum - Support for enumerations.md

enum - Support for enumerations

The enum module in Python provides a way to define a set of symbolic names bound to unique values. This is particularly useful for creating clear, readable code that avoids magic numbers and makes it easier to maintain.

Below are some comprehensive examples demonstrating various functionalities of the enum module:

# Importing the enum module
from enum import Enum

# Example 1: Basic usage of Enum with auto-incremental values
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

# Accessing an enum member by its name or value
print(Color.RED)  # Output: Color.RED
print(Color(2))     # Output: Color.GREEN

# Iterating over all members of the Enum
for color in Color:
    print(color)

# Example 2: Using auto-incremental values with a starting point
class Day(Enum):
    MONDAY = 1
    TUESDAY
    WEDNESDAY
    THURSDAY
    FRIDAY
    SATURDAY
    SUNDAY

print(Day.MONDAY)  # Output: Day.MONDAY
print(Day.TUESDAY)  # Output: Day.TUESDAY
# Note: The next value is automatically determined based on the previous one

# Example 3: Using automatic enumeration values with a custom step
class Step(Enum):
    FIRST = 0
    SECOND = -1
    THIRD = None

print(Step.FIRST)   # Output: Step.FIRST
print(Step.SECOND)  # Output: Step.SECOND
print(Step.THIRD)  # Output: Step.THIRD

# Example 4: Using flags to combine multiple enum members
class Flags(Enum):
    READ = 1
    WRITE = 2
    EXECUTE = 4

combined_flags = Flags.READ | Flags.WRITE | Flags.EXECUTE
print(combined_flags)  # Output: Flags(7)

# Checking if a member is in an enum
if Flags.WRITE in combined_flags:
    print("WRITE flag is set")

# Example 5: Using auto-incremental values with a custom step and starting point
class AutoIncrement(Enum):
    ONE = 1
    TWO
    THREE
    FOUR

print(AutoIncrement.ONE)  # Output: AutoIncrement.ONE
print(AutoIncrement.THREE)  # Output: AutoIncrement.THREE

The enum module provides a powerful way to define enumerations in Python, making code more readable and maintainable. It also offers additional functionalities like combining enum members using flags and customizing the enumeration values. By using enums, you can create clear, self-documenting code that is easier to understand and work with.

graphlib - Functionality to operate with graph-like structures.md

graphlib - Functionality to operate with graph-like structures

The graphlib module is part of Python's standard library and provides an API for working with directed graphs. While it is not as commonly used as some other graph libraries like NetworkX, it can be useful for specific use cases where you need a simple, lightweight solution.

Here are comprehensive code examples demonstrating various functionalities in the graphlib module:

import graphlib

# Example 1: Creating and manipulating a DirectedGraph

def create_and_manipulate_directed_graph():
    """
    This example demonstrates how to create a DirectedGraph and perform basic operations.
    """

    # Create a new DirectedGraph instance
    dg = graphlib.DirectedGraph()

    # Add nodes to the graph
    dg.add_node('A')
    dg.add_node('B')
    dg.add_node('C')

    # Add edges between nodes
    dg.add_edge(('A', 'B'))
    dg.add_edge(('B', 'C'))

    # Print nodes and edges in the graph
    print("Nodes:", list(dg.nodes()))
    print("Edges:", list(dg.edges()))

    # Check if a node is in the graph
    print("Node A exists:", dg.has_node('A'))

    # Check if an edge exists between two nodes
    print("Edge (A, B) exists:", dg.has_edge(('A', 'B')))

    # Remove a node and all its edges
    dg.remove_node('B')
    print("After removing node B:")
    print("Nodes:", list(dg.nodes()))
    print("Edges:", list(dg.edges()))

# Example 2: Topological Sorting

def perform_topological_sort():
    """
    This example demonstrates how to perform a topological sort on a DirectedGraph.
    """

    # Create a new DirectedGraph instance
    dg = graphlib.DirectedGraph()

    # Add nodes and edges
    dg.add_node('A')
    dg.add_node('B')
    dg.add_node('C')
    dg.add_edge(('A', 'B'))
    dg.add_edge(('B', 'C'))

    # Perform topological sort
    try:
        sorted_nodes = list(dg.toposort())
        print("Topological Sort:", sorted_nodes)
    except graphlib.CycleError as e:
        print(f"Graph contains a cycle: {e}")

# Example 3: Finding Strongly Connected Components

def find_strongly_connected_components():
    """
    This example demonstrates how to find strongly connected components in a DirectedGraph.
    """

    # Create a new DirectedGraph instance
    dg = graphlib.DirectedGraph()

    # Add nodes and edges
    dg.add_node('A')
    dg.add_node('B')
    dg.add_node('C')
    dg.add_edge(('A', 'B'))
    dg.add_edge(('B', 'C'))
    dg.add_edge(('C', 'A'))

    # Find strongly connected components
    scc = dg.strongly_connected_components()
    print("Strongly Connected Components:", list(scc))

# Run the examples
if __name__ == "__main__":
    create_and_manipulate_directed_graph()
    perform_topological_sort()
    find_strongly_connected_components()

Explanation:

  1. Creating and Manipulating a DirectedGraph:
  2. We create an instance of graphlib.DirectedGraph.
  3. We add nodes and edges to the graph.
  4. We print nodes, edges, and check for node and edge existence.
  5. We remove a node and verify the changes.

  6. Topological Sorting:

  7. We perform a topological sort on a DirectedGraph that does not contain cycles.
  8. We handle potential CycleError exceptions if the graph contains cycles.

  9. Finding Strongly Connected Components:

  10. We find strongly connected components in a DirectedGraph using the strongly_connected_components method.
  11. This method is useful for analyzing the structure of a directed graph to identify groups of nodes where each node can reach every other node within that group.

These examples provide a basic understanding of how to use the graphlib module for various graph operations. You can further explore the documentation and additional methods available in the module for more advanced use cases.

heapq - Heap queue algorithm.md

heapq - Heap queue algorithm

The heapq module in Python provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. This module is optimized for speed and space efficiency, making it suitable for applications where you need to maintain a collection of elements with priorities.

Below are comprehensive examples demonstrating various functionalities of the heapq module:

1. Creating a Min-Heap

import heapq

# Create an empty min-heap
min_heap = []

# Add elements to the heap
heapq.heappush(min_heap, 3)
heapq.heappush(min_heap, 1)
heapq.heappush(min_heap, 4)

# Output the current state of the heap
print("Heap after push:", min_heap)  # Output: [1, 3, 4]

# Pop the smallest element from the heap
smallest = heapq.heappop(min_heap)
print("Smallest element popped:", smallest)  # Output: 1

# Push a new element and pop the next smallest element
heapq.heappush(min_heap, 0)
print("Heap after push (0):", min_heap)  # Output: [0, 3, 4]
smallest = heapq.heappop(min_heap)
print("Next smallest element popped:", smallest)  # Output: 0

2. Creating a Max-Heap

To use heapq as a max-heap, you can negate the values when pushing and popping. This is because heapq implements a min-heap by default.

import heapq

# Create an empty max-heap
max_heap = []

# Add elements to the heap by negating them
heapq.heappush(max_heap, -3)
heapq.heappush(max_heap, -1)
heapq.heappush(max_heap, -4)

# Output the current state of the heap
print("Heap after push (max-heap):", [-x for x in max_heap])  # Output: [3, 1, 4]

# Pop the largest element from the heap
largest = -heapq.heappop(max_heap)
print("Largest element popped:", largest)  # Output: 3

# Push a new element and pop the next largest element
heapq.heappush(max_heap, -0)
print("Heap after push (-0):", [-x for x in max_heap])  # Output: [1, 4, 0]
largest = -heapq.heappop(max_heap)
print("Next largest element popped:", largest)  # Output: 1

3. Finding the N Smallest Elements

The nlargest and nsmallest functions are used to find the N largest or smallest elements in a list.

import heapq

# List of numbers
numbers = [7, 10, 4, 3, 20, 15]

# Find the three largest numbers
largest_three = heapq.nlargest(3, numbers)
print("Three largest numbers:", largest_three)  # Output: [20, 15, 10]

# Find the two smallest numbers
smallest_two = heapq.nsmallest(2, numbers)
print("Two smallest numbers:", smallest_two)  # Output: [3, 4]

4. Priority Queue with Time-Sorted Elements

The heapq module can also be used to implement a priority queue.

import heapq

# Priority queue list
priority_queue = []

# Add elements to the priority queue
heapq.heappush(priority_queue, (10, 'a'))
heapq.heappush(priority_queue, (20, 'b'))
heapq.heappush(priority_queue, (5, 'c'))

# Process each element in order of their priority
while priority_queue:
    priority, item = heapq.heappop(priority_queue)
    print(f"Processed {item} with priority {priority}")

5. Finding the k Closest Points to a Given Point

This example demonstrates how to use heapq to find the k closest points to a given point in a list of points.

import heapq

# List of points (x, y)
points = [(3, 4), (1, 2), (1, -1), (-2, 0)]

# Given point (x0, y0)
given_point = (0, 0)

# Find the k closest points to the given point
k = 2
closest_points = heapq.nsmallest(k, points, key=lambda p: (p[0] ** 2 + p[1] ** 2))
print("K closest points:", closest_points)  # Output: [(1, -1), (3, 4)]

Conclusion

The heapq module provides a efficient and flexible way to manage heaps in Python. Whether you need to maintain a min-heap, max-heap, or perform operations like finding the N largest/smallest elements, this module offers the tools to do so with ease.

pprint - Data pretty printer.md

pprint - Data pretty printer

Below are comprehensive code examples for using the pprint module in Python, along with detailed explanations of each example.

Example 1: Basic Usage

import pprint

# Define a sample data structure
data = {
    'name': 'John Doe',
    'age': 30,
    'is_student': False,
    'courses': ['Math', 'Science', 'English'],
    'address': {
        'street': '123 Main St',
        'city': 'Anytown',
        'state': 'CA',
        'zip': '12345'
    }
}

# Use pprint.pprint() to pretty-print the data
pprint.pprint(data)

Explanation: - The pprint module provides a way to print complex data structures in a readable format. - The pprint.pprint() function takes an object and prints it with indentation, making it easier to read.

Example 2: Customizing Output

import pprint

# Define a sample data structure
data = {
    'name': 'Jane Smith',
    'age': 35,
    'is_student': True,
    'courses': ['Biology', 'Chemistry'],
    'address': {
        'street': '456 Elm St',
        'city': 'Othertown',
        'state': 'NY',
        'zip': '67890'
    }
}

# Create a PrettyPrinter instance with custom settings
pp = pprint.PrettyPrinter(indent=2, width=50)

# Use the custom PrettyPrinter to print the data
pp.pprint(data)

Explanation: - The PrettyPrinter class allows for more customization of the output. - You can specify the number of spaces per indentation level with the indent parameter. - The maximum line length is controlled by the width parameter.

Example 3: Handling Large Data Structures

import pprint

# Define a large sample data structure
data = {
    'employees': [
        {'name': 'Alice Johnson', 'department': 'Sales'},
        {'name': 'Bob Brown', 'department': 'Marketing'},
        {'name': 'Charlie Smith', 'department': 'IT'}
    ],
    'orders': [
        {'order_id': 101, 'amount': 29.99},
        {'order_id': 102, 'amount': 45.75},
        {'order_id': 103, 'amount': 69.49}
    ]
}

# Use pprint.pprint() to pretty-print the large data structure
pprint.pprint(data)

Explanation: - The pprint module is particularly useful for handling large or complex data structures. - It automatically breaks lines and adjusts the indentation to fit within a specified width, which can be helpful when dealing with extensive data.

Example 4: Using PrettyPrinter for Files

import pprint

# Define a sample data structure
data = {
    'name': 'David Wilson',
    'age': 28,
    'is_student': False,
    'courses': ['History', 'Literature'],
    'address': {
        'street': '789 Oak St',
        'city': 'Somewhere',
        'state': 'TX',
        'zip': '56789'
    }
}

# Open a file for writing and use PrettyPrinter to write the data
with open('data.txt', 'w') as file:
    pp = pprint.PrettyPrinter(indent=2)
    pp.pprint(data, stream=file)

Explanation: - You can also use the PrettyPrinter instance to print to a file instead of the console. - The stream parameter is used to specify where the output should be written.

Example 5: Pretty Printing JSON-like Structures

import pprint
import json

# Define a sample data structure
data = {
    'name': 'Eve Johnson',
    'age': 22,
    'is_student': True,
    'courses': ['Physics', 'Astrophysics'],
    'address': {
        'street': '101 Pine St',
        'city': 'Somewhere Else',
        'state': 'FL',
        'zip': '43210'
    }
}

# Convert the data structure to a JSON string
json_data = json.dumps(data, indent=2)

# Use pprint.pprint() to pretty-print the JSON-like structure
pprint.pprint(json_data)

Explanation: - The json module can be used to convert data structures into JSON format. - You can then use the pprint module to print this JSON string in a readable format.

These examples demonstrate various ways to use the pprint module, from basic usage to more complex scenarios. By following these examples, you can effectively leverage the pprint module to enhance the readability of your data structures in Python.

reprlib - Alternate repr() implementation.md

reprlib - Alternate repr() implementation

The reprlib module provides a function called repr() that is similar to Python's built-in repr() function but with some additional features, particularly when dealing with large or complex objects. It can help reduce memory usage by returning an abbreviated version of the string representation of an object when it would otherwise be very verbose.

Here are some examples demonstrating how to use the reprlib module:

  1. Abbreviating Large Strings: When working with strings that are too long to display in a single line, reprlib.repr() can return an abbreviated version by truncating the string and adding ellipses (...) at the end.

```python import reprlib

# Example of an extremely long string long_string = 'a' * 1000 print(repr(long_string)) # Output: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...' ```

  1. Abbreviating Lists with Many Elements: When dealing with lists that contain many elements, reprlib.repr() can return an abbreviated version by showing only the first few and last few elements.

```python import reprlib

# Example of a list with a large number of elements long_list = [str(i) for i in range(1000)] print(repr(long_list)) # Output: ["0", "1", ..., "997", "...", "998", "999"] ```

  1. Abbreviating Sets with Many Elements: Similar to lists, reprlib.repr() can abbreviate sets by showing only a few elements and the ellipsis.

```python import reprlib

# Example of a set with many elements long_set = {i for i in range(1000)} print(repr(long_set)) # Output: {0, 1, ..., 997, ..., 998, 999} ```

  1. Abbreviating Dictionaries with Many Key-Value Pairs: When dealing with dictionaries with many key-value pairs, reprlib.repr() can show only a few elements and the ellipsis.

```python import reprlib

# Example of a dictionary with many key-value pairs long_dict = {f'key{i}': f'value{i}' for i in range(1000)} print(repr(long_dict)) # Output: {'key0': 'value0', ..., 'key997': 'value997', ..., 'key998': 'value998', 'key999': 'value999'} ```

  1. Using reprlib.repr() in Custom Classes: You can also use reprlib.repr() within your own custom classes to control the string representation.

```python import reprlib

class MyClass: def init(self, data): self.data = data

   def __repr__(self):
       return reprlib.repr(self.data)

# Example of a custom class with a large dataset obj = MyClass('a' * 1000) print(obj) # Output: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...' ```

These examples demonstrate how reprlib.repr() can help manage and display the string representations of complex objects in Python, reducing memory usage and improving readability.

struct - Interpret bytes as packed binary data.md

struct - Interpret bytes as packed binary data

The struct module in Python provides support for interpreting strings of bytes as packed binary data. It allows you to convert between binary data and native Python data types such as integers, floating-point numbers, and characters. Here are some comprehensive examples demonstrating various functionalities of the struct module:

Example 1: Packing Binary Data

import struct

# Pack an integer into bytes
int_value = 42
packed_int = struct.pack('>I', int_value)
print(f"Packed integer (big-endian): {packed_int}")

# Pack a float into bytes
float_value = 3.14
packed_float = struct.pack('>f', float_value)
print(f"Packed float (big-endian): {packed_float}")

Example 2: Unpacking Binary Data

import struct

# Unpack binary data back to an integer
packed_int = b'\x00\x00\x00\x46'
unpacked_int, consumed_bytes = struct.unpack('>I', packed_int)
print(f"Unpacked integer (big-endian): {unpacked_int}")
print(f"Number of bytes consumed: {consumed_bytes}")

# Unpack binary data back to a float
packed_float = b'\x00\x00\x80\x40'
unpacked_float, consumed_bytes = struct.unpack('>f', packed_float)
print(f"Unpacked float (big-endian): {unpacked_float}")
print(f"Number of bytes consumed: {consumed_bytes}")

Example 3: Packing and Unpacking with Different Endianness

import struct

# Pack an integer into big-endian bytes
int_value = 42
packed_int_big_endian = struct.pack('>I', int_value)
print(f"Packed integer (big-endian): {packed_int_big_endian}")

# Pack an integer into little-endian bytes
packed_int_little_endian = struct.pack('<I', int_value)
print(f"Packed integer (little-endian): {packed_int_little_endian}")

# Unpack big-endian packed data back to an integer
unpacked_int_from_big_endian, consumed_bytes = struct.unpack('>I', packed_int_big_endian)
print(f"Unpacked integer from big-endian: {unpacked_int_from_big_endian}")
print(f"Number of bytes consumed: {consumed_bytes}")

# Unpack little-endian packed data back to an integer
unpacked_int_from_little_endian, consumed_bytes = struct.unpack('<I', packed_int_little_endian)
print(f"Unpacked integer from little-endian: {unpacked_int_from_little_endian}")
print(f"Number of bytes consumed: {consumed_bytes}")

Example 4: Using struct.calcsize to Determine the Size of a Format String

import struct

# Define a format string
format_string = '>I'

# Calculate the size of the packed data based on the format string
size = struct.calcsize(format_string)
print(f"Size of the packed data in bytes: {size}")

Example 5: Handling Variable-Length Packed Data

import struct

# Pack a variable-length list of integers into bytes
int_values = [1, 2, 3, 4, 5]
packed_ints = b''.join(struct.pack('>I', value) for value in int_values)
print(f"Packed list of integers (big-endian): {packed_ints}")

# Unpack the packed data back to a list of integers
unpacked_ints, consumed_bytes = struct.unpack('>' + 'I' * len(int_values), packed_ints)
print(f"Unpacked list of integers: {unpacked_ints}")

Example 6: Handling Special Characters and Strings

import struct

# Pack a string into bytes using ASCII encoding
string_value = "Hello, World!"
packed_string = struct.pack('13s', string_value.encode('ascii'))
print(f"Packed string (using ASCII): {packed_string}")

# Unpack the packed string back to a Python string
unpacked_string, consumed_bytes = struct.unpack('13s', packed_string)
print(f"Unpacked string: {unpacked_string.decode('ascii')}")

Example 7: Handling Non-ASCII Characters

import struct

# Pack a string into bytes using UTF-8 encoding
string_value = "Hello, World!"
packed_string_utf8 = struct.pack('>32s', string_value.encode('utf-8'))
print(f"Packed string (using UTF-8): {packed_string_utf8}")

# Unpack the packed string back to a Python string
unpacked_string_utf8, consumed_bytes = struct.unpack('>32s', packed_string_utf8)
print(f"Unpacked string: {unpacked_string_utf8.decode('utf-8')}")

Example 8: Handling Variable-Length Strings

import struct

# Pack a list of variable-length strings into bytes using ASCII encoding
string_values = ["Hello", "World", "!"]
packed_strings = b''.join(struct.pack('32s', value.encode('ascii')) for value in string_values)
print(f"Packed list of strings (using ASCII): {packed_strings}")

# Unpack the packed strings back to a list of Python strings
unpacked_strings, consumed_bytes = struct.unpack('>I' + '32s' * len(string_values), packed_strings)
unpacked_strings = [value.decode('ascii') for value in unpacked_strings[1:]]
print(f"Unpacked list of strings: {unpacked_strings}")

Example 9: Handling Variable-Length Packed Data with a Fixed Length Prefix

import struct

# Pack a variable-length list of integers into bytes, prefixed by the count
int_values = [1, 2, 3, 4, 5]
count = len(int_values)
packed_ints_with_count = struct.pack('>I' + 'I' * count, count) + b''.join(struct.pack('>I', value) for value in int_values)
print(f"Packed list of integers with count (big-endian): {packed_ints_with_count}")

# Unpack the packed data back to a list of integers
unpacked_count = struct.unpack('>I', packed_ints_with_count[:4])[0]
unpacked_ints, consumed_bytes = struct.unpack('>' + 'I' * unpacked_count, packed_ints_with_count[4:])
print(f"Unpacked count: {unpacked_count}")
print(f"Unpacked list of integers: {unpacked_ints}")

These examples cover various scenarios involving the struct module, from basic integer and float packing to more complex cases such as variable-length lists and strings. Each example includes comments explaining key aspects, making it easy to understand and use in real-world applications.

types - Dynamic type creation and names for built-in types.md

types - Dynamic type creation and names for built-in types

The types module in Python provides a way to create new types dynamically using the types.ModuleType, types.FunctionType, types.BuiltinFunctionType, and other classes. This is useful for extending the language or creating custom data structures with specific behaviors.

Below are comprehensive code examples for various functionalities provided by the types module:

1. Creating a Custom Module

import types

# Create a new module dynamically
new_module = types.ModuleType("my_custom_module")

# Add attributes to the module
new_module.my_variable = "Hello, World!"
new_module.my_function = lambda x: f"Value is {x}"

# Accessing module attributes
print(new_module.my_variable)  # Output: Hello, World!
print(new_module.my_function(42))  # Output: Value is 42

# You can also import the module as if it were a regular Python file
import my_custom_module
print(my_custom_module.my_variable)  # Output: Hello, World!
print(my_custom_module.my_function(42))  # Output: Value is 42

2. Creating a Custom Function

import types

# Define a custom function using the FunctionType
def custom_function(x):
    return x * 2

# Create an instance of FunctionType with specified arguments and defaults
custom_func_instance = types.FunctionType(
    func=custom_function,
    args=("x",),
    dargs=(10,),
    kwonlydargs=tuple(),
    kws=("y",),
    defaults=(5,),
    closure=None
)

# Call the custom function
print(custom_func_instance(3))  # Output: 20 (10 * 3)
print(custom_func_instance(y=6, x=7))  # Output: 49 (7 * 6 + 5)

3. Creating a Custom Builtin Function

import types

# Define a custom built-in function using the BuiltinFunctionType
def custom_builtin_function(x):
    return x ** 2

# Create an instance of BuiltinFunctionType with specified arguments and defaults
custom_builtin_func_instance = types.BuiltinFunctionType(
    func=custom_builtin_function,
    args=("x",),
    dargs=(5,),
    kwonlydargs=tuple(),
    kws=("y",),
    defaults=(3,),
    closure=None
)

# Call the custom built-in function
print(custom_builtin_func_instance(2))  # Output: 4 (2 ** 2)
print(custom_builtin_func_instance(y=3, x=4))  # Output: 16 (4 ** 3 + 3)

4. Creating a Custom Class

import types

# Define a custom class using the type() function
class MyCustomClass:
    def __init__(self, value):
        self.value = value

# Create an instance of MyCustomClass
my_instance = MyCustomClass(10)

# Accessing the attribute of the custom class
print(my_instance.value)  # Output: 10

# You can also define methods for the class dynamically
MyCustomClass.my_method = types.MethodType(lambda self: f"My value is {self.value}", MyCustomClass)

print(my_instance.my_method())  # Output: My value is 10

5. Creating a Custom Exception

import types

# Define a custom exception using the type() function
class MyCustomError(Exception):
    pass

# Create an instance of MyCustomError
try:
    raise MyCustomError("This is a custom error")
except MyCustomError as e:
    print(e)  # Output: This is a custom error

6. Creating a Custom Method Type

import types

# Define a custom method using the MethodType function
def my_method(self):
    return f"Hello from {self.__class__.__name__}"

# Create an instance of MethodType for MyCustomClass
MyCustomClass.my_method = types.MethodType(my_method, MyCustomClass)

my_instance = MyCustomClass()
print(my_instance.my_method())  # Output: Hello from MyCustomClass

7. Creating a Custom Type with Slots

import types

# Define a custom type with slots using the type() function
MyCustomType = types.new_class(
    "MyCustomType",
    bases=(object,),
    exec_body=lambda cls, locals: locals.update({
        "__slots__": ("value",)
    })
)

# Create an instance of MyCustomType
my_instance = MyCustomType()
my_instance.value = 20

print(my_instance.value)  # Output: 20

# Accessing the attribute directly without slots is not allowed
try:
    my_instance.non_slot_attribute = 30
except AttributeError as e:
    print(e)  # Output: 'MyCustomType' object has no attribute 'non_slot_attribute'

8. Creating a Custom Type with New

import types

# Define a custom type using the new() function
class MyCustomClass:
    def __init__(self, value):
        self.value = value

# Create an instance of MyCustomClass
my_instance = MyCustomClass(10)

# Accessing the attribute of the custom class
print(my_instance.value)  # Output: 10

# You can also define methods for the class dynamically
MyCustomClass.my_method = types.MethodType(lambda self: f"My value is {self.value}", MyCustomClass)

print(my_instance.my_method())  # Output: My value is 10

These examples demonstrate how to use various classes and functions in the types module to create dynamic types, functions, methods, classes, exceptions, and more. Each example includes comments explaining the purpose of each step and the expected output.

weakref - Weak references.md

weakref - Weak references

Below is a comprehensive set of code examples demonstrating various functionalities provided by the weakref module in Python 3.12. Each example includes comments explaining each step to help clarify its purpose and usage.

import weakref

# Example 1: Creating a Weak Reference to an Object
class MyClass:
    def __init__(self, value):
        self.value = value

# Create an instance of MyClass
obj = MyClass(42)

# Create a weak reference to obj
weak_obj = weakref.ref(obj)

# Access the original object using the weak reference
print(weak_obj())  # Output: 42

# Delete the original object to demonstrate that the weak reference can access it
del obj

# The original object is no longer accessible through the weak reference
try:
    print(weak_obj())
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 2: Using a Weak Reference as a Dictionary Key
my_dict = weakref.WeakValueDictionary()
key_ref = weakref.ref(obj)
value_ref = weakref.ref(MyClass(10))

my_dict[key_ref] = value_ref

print(my_dict)  # Output: {<weakproxy at 0x...>: <weakproxy at 0x...>}

# Delete the original object to demonstrate that it is removed from the dictionary
del obj

# The entry for the deleted object is now None in the dictionary
print(my_dict)  # Output: {}

# Example 3: Handling Reference Cycles
class CycleA:
    def __init__(self, b):
        self.b = b

class CycleB:
    def __init__(self, a):
        self.a = a

a = CycleA(b=CycleB(a=a))
b = CycleB(a=a)

# Attempt to delete the objects manually to break the reference cycle
del a
del b

# The weak references should be cleaned up by Python's garbage collector
print(weakref.getweakrefs(CycleA))  # Output: []
print(weakref.getweakrefs(CycleB))  # Output: []

# Example 4: Using `proxy` to create a proxy object
class ProxyObject:
    def __init__(self, target):
        self.target = target

    def __getattr__(self, attr):
        return getattr(self.target(), attr)

obj_proxy = weakref.proxy(obj)
print(obj_proxy.value)  # Output: 42

# Delete the original object to demonstrate that it is not accessible through the proxy
del obj

try:
    print(obj_proxy.value)
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 5: Using `proxy` to create a context manager
class ManagedResource:
    def __init__(self, resource):
        self.resource = resource

    def __enter__(self):
        print(f"Entering {self.resource}")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print(f"Exiting {self.resource}")

resource = ManagedResource("some resource")
with weakref.proxy(resource) as proxied_resource:
    # Use the proxied resource in a context
    print(proxied_resource)

# Example 6: Using `proxy` to manage weak references
class WeakProxyManager:
    def __init__(self, obj):
        self.obj = obj

    def use(self):
        print(f"Using {self.obj}")

obj_manager = WeakProxyManager(obj)
proxied_manager = weakref.proxy(obj_manager)

proxied_manager.use()  # Output: Using <weakproxy at 0x...>

# Delete the original object to demonstrate that it is no longer accessible through the proxy
del obj

try:
    proxied_manager.use()
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 7: Using `proxy` to manage weak references with custom methods
class CustomProxyManager:
    def __init__(self, obj):
        self.obj = obj

    def perform_action(self):
        print(f"Performing action on {self.obj}")

obj_manager = CustomProxyManager(obj)
proxied_manager = weakref.proxy(obj_manager)

proxied_manager.perform_action()  # Output: Performing action on <weakproxy at 0x...>

# Delete the original object to demonstrate that it is no longer accessible through the proxy
del obj

try:
    proxied_manager.perform_action()
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 8: Using `proxy` to manage weak references with custom attributes
class AttributeProxyManager:
    def __init__(self, obj):
        self.obj = obj

    @property
    def status(self):
        return "Active"

obj_manager = AttributeProxyManager(obj)
proxied_manager = weakref.proxy(obj_manager)

print(proxied_manager.status)  # Output: Active

# Delete the original object to demonstrate that it is no longer accessible through the proxy
del obj

try:
    print(proxied_manager.status)
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 9: Using `proxy` to manage weak references with custom functions
class FunctionProxyManager:
    def __init__(self, obj):
        self.obj = obj

    def do_something(self):
        print(f"Doing something with {self.obj}")

obj_manager = FunctionProxyManager(obj)
proxied_manager = weakref.proxy(obj_manager)

proxied_manager.do_something()  # Output: Doing something with <weakproxy at 0x...>

# Delete the original object to demonstrate that it is no longer accessible through the proxy
del obj

try:
    proxied_manager.do_something()
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

# Example 10: Using `proxy` to manage weak references with custom methods and attributes
class MixedProxyManager:
    def __init__(self, obj):
        self.obj = obj

    def do_something(self):
        print(f"Doing something with {self.obj}")

    @property
    def status(self):
        return "Active"

obj_manager = MixedProxyManager(obj)
proxied_manager = weakref.proxy(obj_manager)

proxied_manager.do_something()  # Output: Doing something with <weakproxy at 0x...>
print(proxied_manager.status)  # Output: Active

# Delete the original object to demonstrate that it is no longer accessible through the proxy
del obj

try:
    proxied_manager.do_something()
    print(proxied_manager.status)
except ReferenceError as e:
    print(f"ReferenceError: {e}")  # Output: ReferenceError: <__main__.MyClass object at 0x...>

Key Points:

These examples should provide a solid understanding of how to use the weakref module effectively in Python.

zoneinfo - IANA time zone support.md

zoneinfo - IANA time zone support

The zoneinfo module in Python is part of the standard library and provides classes for representing and manipulating timezone information according to the International Organization for Standardization (ISO) 8601 standard. This module allows you to work with time zones in a way that's both efficient and flexible.

Here are comprehensive examples demonstrating various functionalities of the zoneinfo module:

Example 1: Getting Time Zone Information

import zoneinfo

# Get a specific timezone
timezone = zoneinfo.ZoneInfo("America/New_York")

# Print the time zone name
print(timezone)  # Output: America/New_York

# Convert a naive datetime to a localized datetime
from datetime import datetime, timedelta

naive_datetime = datetime.now()
localized_datetime = naive_datetime.astimezone(timezone)
print(localized_datetime)  # Output: datetime.datetime(2023, 10, 15, 14, 30, tzinfo=zoneinfo.ZoneInfo('America/New_York'))

# Get the offset from UTC
offset = timezone.utcoffset(localized_datetime)
print(offset)  # Output: timedelta(hours=-4)

# Get the daylight saving time status
daylight_savings_time = timezone.dst(localized_datetime)
print(daylight_savings_time)  # Output: None

Example 2: Iterating Over Time Zones

import zoneinfo

# Iterate over all available time zones
for tz in zoneinfo.available_timezones():
    print(tz)  # Print the name of each timezone

# Get a specific time zone by its ID and use it to localize a datetime
timezone = zoneinfo.ZoneInfo("Asia/Tokyo")
localized_datetime = datetime.now(timezone)
print(localized_datetime)  # Output: datetime.datetime(2023, 10, 15, 14, 30, tzinfo=zoneinfo.ZoneInfo('Asia/Tokyo'))

Example 3: Handling Time Zone Differences

import zoneinfo

# Define two time zones
timezone_utc = zoneinfo.ZoneInfo("UTC")
timezone_eastern = zoneinfo.ZoneInfo("America/New_York")

# Create a datetime object for a specific date and time in UTC
utc_datetime = timezone_utc.localize(datetime(2023, 10, 15))

# Convert the UTC datetime to Eastern Standard Time
eastern_datetime = utc_datetime.astimezone(timezone_eastern)
print(eastern_datetime)  # Output: datetime.datetime(2023, 10, 14, 17, 30, tzinfo=zoneinfo.ZoneInfo('America/New_York'))

# Calculate the difference between two datetimes in different time zones
difference = eastern_datetime - utc_datetime
print(difference)  # Output: timedelta(days=-1, hours=2)

Example 4: Using Zone Info Objects

import zoneinfo

# Create a ZoneInfo object directly from a string
tz = zoneinfo.ZoneInfo("Europe/London")

# Check if the created time zone is valid
print(tz)  # Output: Europe/London

# Get a list of all available time zones in a specific country
countries_timezones = zoneinfo.available_timezones_by_country_code("GB")
print(countries_timezones)  # Output: ['Europe/London', 'Europe/Guernsey']

# Use the ZoneInfo object to localize and convert datetimes
utc_datetime = datetime(2023, 10, 15).replace(tzinfo=zoneinfo.utc)
localized_datetime = utc_datetime.astimezone(tz)
print(localized_datetime)  # Output: datetime.datetime(2023, 10, 15, 12, 0, tzinfo=zoneinfo.ZoneInfo('Europe/London'))

Example 5: Handling Time Zones in a Web Application

import zoneinfo
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/time', methods=['GET'])
def get_time():
    # Get the timezone from query parameters or default to UTC
    tz_str = request.args.get('timezone', 'UTC')

    # Create a ZoneInfo object for the specified timezone
    try:
        tz = zoneinfo.ZoneInfo(tz_str)
    except ValueError as e:
        return jsonify({"error": f"Invalid timezone: {tz_str}"}), 400

    # Get the current local datetime
    now = datetime.now(tz)

    # Return the formatted datetime
    response = {
        "datetime": now.isoformat(),
        "timezone": tz_str
    }
    return jsonify(response)

if __name__ == '__main__':
    app.run(debug=True)

Example 6: Using Zone Info in a Command Line Tool

import zoneinfo
from datetime import datetime, timedelta

def main():
    # Get the current time in a specified timezone
    tz_str = input("Enter the timezone (e.g., America/New_York): ")
    tz = zoneinfo.ZoneInfo(tz_str)

    # Get the current local datetime
    now = datetime.now(tz)

    # Display the current local datetime in the specified timezone
    print(f"Current time in {tz_str}: {now}")

if __name__ == "__main__":
    main()

Example 7: Handling Time Zones with pytz for Compatibility

from zoneinfo import ZoneInfo
import pytz
from datetime import datetime, timedelta

# Create a ZoneInfo object using pytz compatibility
timezone = ZoneInfo(pytz.timezone("America/New_York"))

# Get the current local datetime
now = datetime.now(timezone)
print(now)  # Output: datetime.datetime(2023, 10, 15, 14, 30, tzinfo=zoneinfo.ZoneInfo('America/New_York'))

# Convert the datetime to UTC
utc_datetime = now.astimezone(pytz.utc)
print(utc_datetime)  # Output: datetime.datetime(2023, 10, 15, 14, 30, tzinfo=pytz.utc)

These examples demonstrate various ways to use the zoneinfo module to handle time zones in Python. Each example covers different aspects of working with time zones, from simple conversions and localizations to more complex applications like web development or command-line tools.

Concurrent Execution

_thread - Low-level threading API.md

_thread - Low-level threading API

The _thread module in Python is a low-level interface to threading that provides more control over thread management than the higher-level threading module. This module is mainly used when you need to write specific types of programs or have very tight requirements on performance.

Below are comprehensive code examples for various functionalities provided by the _thread module:

Example 1: Creating and Starting a Thread

import _thread
import time

# Define a function that will be run in a thread
def worker():
    print(f"Worker started at {time.strftime('%Y-%m-%d %H:%M:%S')}")
    for i in range(5):
        print(f"Worker working: {i+1}")
        time.sleep(1)
    print("Worker finished.")

# Create and start a thread
_thread.start_new_thread(worker, ())

# Main program waits for the worker to finish before exiting
time.sleep(6)  # Wait for the thread to complete

print("Main program completed.")

Explanation: - This example demonstrates how to create and start a new thread using _thread.start_new_thread(). - The worker function is defined and passed as the target function. - The main program waits for the worker to finish by calling time.sleep(6), which gives enough time for the worker to complete its tasks.

Example 2: Using Thread Locks

import _thread
import threading
import time  # Add this import

# Define a lock object
lock = threading.Lock()

def worker(lock, name):
    with lock:
        print(f"{name} acquired the lock at {time.strftime('%Y-%m-%d %H:%M:%S')}")
        time.sleep(2)
        print(f"{name} released the lock.")

# Create and start threads with different names
_thread.start_new_thread(worker, (lock, "Thread 1"))
_thread.start_new_thread(worker, (lock, "Thread 2"))

# Main program waits for all threads to complete
time.sleep(5)  # Wait long enough for both threads to finish

print("All workers completed.")

Explanation: - A Lock object is created using threading.Lock(). - The worker function acquires the lock using a with statement, ensuring that the lock is properly released after the block of code is executed. - Two threads are started with different names, and they attempt to acquire and release the lock concurrently.

Example 3: Using Thread Events

import _thread
import threading
import time

# Define an event object
event = threading.Event()

def worker(event):
    while not event.is_set():
        print(f"Worker is waiting for the event.")
        time.sleep(1)
    print("Worker received the event and completed.")

# Start a thread that waits on the event
_thread.start_new_thread(worker, (event,))

# Simulate some work before setting the event
time.sleep(3)

# Set the event to unblock the worker
print("Setting the event...")
event.set()

# Main program waits for the event to be set
time.sleep(2)
print("Event has been set.")

Explanation: - An Event object is created using threading.Event(). - The worker function continuously checks if the event is set. If not, it waits. - The main program simulates some work and sets the event after a delay, which unblocks the worker thread.

Example 4: Using Thread Barrier

import _thread
import threading
import time

# Define a barrier object with two parties
barrier = threading.Barrier(2)

def worker(barrier, name):
    print(f"{name} arrived at the barrier at {time.strftime('%Y-%m-%d %H:%M:%S')}")
    barrier.wait()
    print(f"{name} passed the barrier.")

# Create and start threads with different names
_thread.start_new_thread(worker, (barrier, "Thread 1"))
_thread.start_new_thread(worker, (barrier, "Thread 2"))

# Main program waits for all threads to pass the barrier
time.sleep(2)  # Give some time for both threads to reach the barrier

print("All workers passed the barrier.")

Explanation: - A Barrier object is created with two parties using threading.Barrier(2). - The worker function prints a message when it arrives at the barrier and then calls barrier.wait(), which blocks until all threads have reached the barrier. - The main program waits for all threads to pass the barrier.

Example 5: Using Thread Local Data

import _thread
import threading
import time

# Define a thread local storage object
local_data = threading.local()

def worker(local):
    local.data = "Data from thread"
    print(f"Thread {threading.current_thread().name} set data: {local.data}")

# Start threads and use local data
_thread.start_new_thread(worker, (local_data,))
_thread.start_new_thread(worker, (local_data,))

# Main program waits for all threads to complete
time.sleep(2)  # Wait for the threads to finish

print("All workers completed.")

Explanation: - A ThreadLocal object is created using threading.local(). - The worker function sets a local variable in local_data and prints it. - Each thread uses the same local_data object, but each thread has its own separate instance of the variables.

These examples cover various aspects of using the _thread module, including creating threads, managing locks, using events, synchronizing with barriers, and utilizing thread-local storage.

concurrent.futures - Launching parallel tasks.md

concurrent.futures - Launching parallel tasks

Below are comprehensive code examples for the concurrent.futures module, which provides a high-level interface for asynchronously executing callables. The examples include various ways to use the module to launch parallel tasks.

1. Using ThreadPoolExecutor

The ThreadPoolExecutor class allows you to run multiple functions in separate threads. This is useful for I/O-bound operations where each task can be executed independently of others.

import concurrent.futures
import time

def worker(number):
    """Worker function that takes an integer and returns its square."""
    print(f"Worker {number} starting")
    result = number * number
    print(f"Worker {number} finished, result: {result}")
    return result

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        # Submit tasks to the executor
        future_to_number = {executor.submit(worker, i): i for i in range(10)}

        # Process results
        for future in concurrent.futures.as_completed(future_to_number):
            number = future_to_number[future]
            try:
                result = future.result()
            except Exception as exc:
                print(f"Worker {number} generated an exception: {exc}")
            else:
                print(f"Worker {number} completed with result: {result}")

if __name__ == "__main__":
    main()

2. Using ProcessPoolExecutor

The ProcessPoolExecutor class allows you to run multiple functions in separate processes. This is useful for CPU-bound operations where tasks are independent and can be executed concurrently.

import concurrent.futures
import time

def worker(number):
    """Worker function that takes an integer and returns its square."""
    print(f"Worker {number} starting")
    result = number * number
    print(f"Worker {number} finished, result: {result}")
    return result

def main():
    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        # Submit tasks to the executor
        future_to_number = {executor.submit(worker, i): i for i in range(10)}

        # Process results
        for future in concurrent.futures.as_completed(future_to_number):
            number = future_to_number[future]
            try:
                result = future.result()
            except Exception as exc:
                print(f"Worker {number} generated an exception: {exc}")
            else:
                print(f"Worker {number} completed with result: {result}")

if __name__ == "__main__":
    main()

3. Using ThreadPoolExecutor for I/O-bound Tasks

The ThreadPoolExecutor can also be used for I/O-bound tasks by ensuring that each task does not require a lot of CPU resources.

import concurrent.futures
import time

def worker(number):
    """Worker function that takes an integer and sleeps for it."""
    print(f"Worker {number} starting")
    time.sleep(number)
    print(f"Worker {number} finished")

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        # Submit tasks to the executor
        future_to_number = {executor.submit(worker, i): i for i in range(10)}

        # Process results
        for future in concurrent.futures.as_completed(future_to_number):
            number = future_to_number[future]
            try:
                result = future.result()
            except Exception as exc:
                print(f"Worker {number} generated an exception: {exc}")
            else:
                print(f"Worker {number} completed with result: {result}")

if __name__ == "__main__":
    main()

4. Using ProcessPoolExecutor for CPU-bound Tasks

For CPU-bound tasks, you might want to use ProcessPoolExecutor because each process has its own memory space.

import concurrent.futures
import math

def worker(data):
    """Worker function that takes a list of numbers and calculates their sum."""
    print(f"Worker processing data with {len(data)} elements")
    result = sum(data)
    print(f"Worker completed processing, total: {result}")
    return result

def main():
    data_chunks = [range(1000), range(1000), range(1000)]

    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        # Submit tasks to the executor
        future_to_data = {executor.submit(worker, chunk): chunk for chunk in data_chunks}

        # Process results
        for future in concurrent.futures.as_completed(future_to_data):
            chunk = future_to_data[future]
            try:
                result = future.result()
            except Exception as exc:
                print(f"Worker processing {chunk} generated an exception: {exc}")
            else:
                print(f"Worker processed {chunk} with total: {result}")

if __name__ == "__main__":
    main()

5. Using ThreadPoolExecutor and Future Objects

You can also use Future objects to manage the results of asynchronous tasks.

import concurrent.futures
import time

def worker(number):
    """Worker function that takes an integer and returns its square."""
    print(f"Worker {number} starting")
    time.sleep(number)
    result = number * number
    print(f"Worker {number} finished, result: {result}")
    return result

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        # Submit tasks to the executor
        future_list = [executor.submit(worker, i) for i in range(10)]

        # Process results
        for future in concurrent.futures.as_completed(future_list):
            try:
                result = future.result()
            except Exception as exc:
                print(f"Worker finished with an exception: {exc}")
            else:
                print(f"Worker completed with result: {result}")

if __name__ == "__main__":
    main()

These examples demonstrate how to use concurrent.futures for launching parallel tasks in Python, including both thread-based and process-based execution. Each example includes comments explaining the purpose of each part of the code.

contextvars - Context Variables.md

contextvars - Context Variables

The contextvars module is a part of Python's standard library that provides support for managing contextual variables, which can be used to store data that needs to flow across multiple function calls or processes without explicitly passing it as an argument. This is particularly useful in multi-threaded applications where thread-local storage might not work.

Here are some comprehensive examples demonstrating various functionalities provided by the contextvars module:

import contextvars

# Create a ContextVar named 'user_id'
user_id = contextvars.ContextVar('user_id')

# Define a function that uses the context variable
def process_user_data():
    user_id_value = user_id.get()
    print(f"Processing data for user ID: {user_id_value}")

# Set the value of user_id in the current context
token = user_id.set(12345)
process_user_data()  # Output: Processing data for user ID: 12345

# Use a local context to set a different value for user_id
token2 = user_id.set(67890)
process_user_data()  # Output: Processing data for user ID: 67890

# The original context remains unchanged
user_id.reset(token)
try:
    print(user_id.get())  # Output: None
except LookupError:
    print("user_id is not set")

# Define a function that creates and returns a new context with an updated user ID
def create_context_with_user_id():
    new_context = contextvars.copy_context()
    new_context.run(lambda: user_id.set(12345))
    return new_context

# Create a context from the factory function
new_context = create_context_with_user_id()
new_context.run(process_user_data)  # Output: Processing data for user ID: 12345

# Get the current context and update the user ID in it
current_context = contextvars.copy_context()
current_context.run(lambda: user_id.set(67890))
current_context.run(process_user_data)  # Output: Processing data for user ID: 67890

# Use a local context to set a different value for user_id in the current context
token3 = user_id.set(1024)
process_user_data()  # Output: Processing data for user ID: 1024

# The original context remains unchanged
user_id.reset(token3)
try:
    print(user_id.get())  # Output: None
except LookupError:
    print("user_id is not set")

Key Features and Examples:

  1. ContextVar Creation:
  2. contextvars.ContextVar('user_id') creates a new context variable named user_id.

  3. Setting and Getting Context Variables:

  4. Use user_id.set(value) to set the value of user_id in the current context.
  5. Use user_id.get() to retrieve the current value of user_id.

  6. Local Contexts:

  7. Use contextvars.copy_context() to create a copy of the current context and modify it independently.

  8. Context Resetting:

  9. Call user_id.reset(token) to restore the previous value of user_id.

  10. Factory Functions:

  11. Create a context factory function that sets a specific value for the context variable and returns it.
  12. Use contextvars.copy_context() to access the current context.

  13. Multiple Contexts:

  14. Each thread or process can have its own context, allowing for independent management of contextual variables.

These examples cover the basic usage of the contextvars module in managing context-specific data across different function calls and threads.

multiprocessing - Process-based parallelism.md

multiprocessing - Process-based parallelism

Below are comprehensive examples of how to use various functionalities provided by the multiprocessing module in Python, along with detailed comments explaining each step.

1. Basic Multiprocessing

import multiprocessing
from multiprocessing import Pool
import os

def worker(x):
    """Example function to be executed in a separate process."""
    return x * x

if __name__ == '__main__':
    # Create a pool of worker processes using all system cores
    with Pool(processes=os.process_cpu_count()) as pool:
        # Use the map method to apply the worker function to a list of numbers
        results = pool.map(worker, [1, 2, 3, 4, 5])
    print(os.process_cpu_count())
    print("Results:", results)

2. Using Process Class

import multiprocessing

def worker(x):
    """Example function to be executed in a separate process."""
    return x * x

if __name__ == '__main__':
    # Define a target function for the Process class
    def target_function():
        print("Running in a separate process")

    # Create a Process object and start it
    p = multiprocessing.Process(target=target_function)
    p.start()
    p.join()  # Wait for the process to complete

    print("Process completed")

3. Sharing Data Between Processes

import multiprocessing
from multiprocessing import Manager

def modify_list(data):
    """Function to modify a shared list."""
    data.append(100)

if __name__ == '__main__':
    # Create a manager object for shared objects
    with Manager() as manager:
        # Use the list object from the manager
        shared_data = manager.list([1, 2, 3])

        # Spawn a process to modify the shared data
        p = multiprocessing.Process(target=modify_list, args=(shared_data,))
        p.start()
        p.join()

        print("Shared data after modification:", shared_data)

4. Handling Exceptions in Processes

import multiprocessing
from multiprocessing import Pool

def worker(x):
    """Example function to be executed in a separate process."""
    if x == 0:
        raise ValueError("Division by zero")
    return 1 / x

if __name__ == '__main__':
    with Pool(processes=2) as pool:
        results = []  # Initialize results to ensure it is defined
        try:
            results = pool.map(worker, [5, 0, 3])
        except Exception as e:
            print(f"An error occurred: {e}")

        # Note: The second and third elements in the list are None because of the exception
        print("Results:", results)

5. Using Queue for Inter-Process Communication

import multiprocessing
from multiprocessing import Queue

def producer(q):
    """Producer function to add items to a queue."""
    q.put(10)
    q.put(20)

def consumer(q):
    """Consumer function to retrieve items from the queue."""
    while True:
        item = q.get()
        if item is None:
            break
        print("Received:", item)

if __name__ == '__main__':
    # Create a queue object
    q = Queue()

    # Start producer and consumer processes
    p1 = multiprocessing.Process(target=producer, args=(q,))
    p2 = multiprocessing.Process(target=consumer, args=(q,))

    p1.start()
    p2.start()

    # Wait for all processes to complete
    p1.join()
    q.put(None)  # Signal the consumer process to exit
    p2.join()

6. Using Lock for Synchronization

import multiprocessing
from multiprocessing import Lock, Manager

def shared_task(lock, counter):
    """Function that increments a counter and prints its value."""
    with lock:
        print(f"Thread {multiprocessing.current_process().name}: Lock acquired")
        counter.value += 1
        print(f"Counter value: {counter.value}")

if __name__ == '__main__':
    # Create a lock object
    lock = Lock()

    # Define a counter using Value from the Manager class for shared data
    with Manager() as manager:
        counter = manager.Value('i', 0)

        # Start multiple processes to increment the counter
        processes = [multiprocessing.Process(target=shared_task, args=(lock, counter)) for _ in range(10)]
        for p in processes:
            p.start()

        # Wait for all processes to complete
        for p in processes:
            p.join()

These examples cover a range of functionalities provided by the multiprocessing module, including creating and managing processes, sharing data between them, handling exceptions, using queues for inter-process communication, and synchronizing access to shared resources.

multiprocessing.shared_memory - Shared memory for direct access across processes.md

multiprocessing.shared_memory - Shared memory for direct access across processes

The multiprocessing.shared_memory module provides a way to create shared memory objects that can be accessed by multiple processes directly. This is useful for sharing large amounts of data between processes without having to copy it. Below are comprehensive examples of how to use this module, including creating and accessing shared memory objects in Python 3.12.

Example 1: Creating a Shared Memory Object

This example demonstrates how to create a shared memory object and map it into a shared array.

import multiprocessing as mp


def worker(shared_array):
    # Accessing the shared array from the worker process
    for i in range(len(shared_array)):
        shared_array[i] += 1

if __name__ == "__main__":
    # Create a shared memory object of type 'i' (integer) with size 10
    shm = mp.Array('i', 10)

    # Start a new process that will modify the shared array
    p = mp.Process(target=worker, args=(shm,))
    p.start()
    p.join()

    # Print the modified shared array
    print("Modified shared array:", list(shm))

Example 2: Creating a Shared Memory Object for an Integer

This example shows how to create a shared memory object of type 'i' (int) and initialize it with a specific value.

import multiprocessing as mp

def worker(shared_int):
    # Accessing the shared integer from the worker process
    print("Initial shared integer:", shared_int.value)
    shared_int.value += 1

if __name__ == "__main__":
    # Create a shared memory object of type 'i' (int) with size 1
    shm = mp.Value('i', 5)

    # Start a new process that will modify the shared integer
    p = mp.Process(target=worker, args=(shm,))
    p.start()
    p.join()

    # Print the modified shared integer
    print("Modified shared integer:", shm.value)

Example 3: Creating a Shared Memory Object for a Float

This example demonstrates how to create a shared memory object of type 'f' (float) and initialize it with a specific value.

import multiprocessing as mp

def worker(shared_float):
    # Accessing the shared float from the worker process
    print("Initial shared float:", shared_float.value)
    shared_float.value += 0.1

if __name__ == "__main__":
    # Create a shared memory object of type 'f' (float) with size 1
    shm = mp.Value('f', 5.0)

    # Start a new process that will modify the shared float
    p = mp.Process(target=worker, args=(shm,))
    p.start()
    p.join()

    # Print the modified shared float
    print("Modified shared float:", shm.value)

Example 4: Creating a Shared Memory Object for a List

This example shows how to create a shared memory object of type 'l' (list) and initialize it with a list of values.

import multiprocessing as mp

def worker(shared_list):
    # Accessing the shared list from the worker process
    print("Initial shared list:", shared_list)
    for i in range(len(shared_list)):
        shared_list[i] += 1

if __name__ == "__main__":
    # Create a manager object to manage shared state
    manager = mp.Manager()
    # Create a shared list with the manager
    shm = manager.list([1, 2, 3, 4, 5])

    # Start a new process that will modify the shared list
    p = mp.Process(target=worker, args=(shm,))
    p.start()
    p.join()

    # Print the modified shared list
    print("Modified shared list:", shm)

Example 5: Creating and Accessing Shared Memory Objects Across Multiple Processes

This example demonstrates how to create and access shared memory objects in a more complex scenario involving multiple processes.

import multiprocessing as mp

def worker(shared_array):
    # Accessing the shared array from the worker process
    for i in range(len(shared_array)):
        shared_array[i] += 1

def main():
    # Create a shared memory object of type 'i' (integer) with size 10
    shm = mp.Array('i', 10)

    # Start multiple processes that will modify the shared array
    processes = []
    for _ in range(5):
        p = mp.Process(target=worker, args=(shm,))
        p.start()
        processes.append(p)

    # Wait for all processes to complete
    for p in processes:
        p.join()

    # Print the final modified shared array
    print("Final shared array:", list(shm))

if __name__ == "__main__":
    main()

Example 6: Creating and Accessing Shared Memory Objects with Initial Data

This example demonstrates how to create a shared memory object of type 'l' (list) with initial data and modify it from multiple processes.

import multiprocessing as mp

def worker(shared_list):
    # Accessing the shared list from the worker process
    for i in range(len(shared_list)):
        shared_list[i] += 1

def main():
    # Create a manager object to manage shared data
    manager = mp.Manager()
    # Create a shared list with initial data and size 5
    shm = manager.list([1, 2, 3, 4, 5])

    # Start multiple processes that will modify the shared list
    processes = []
    for _ in range(5):
        p = mp.Process(target=worker, args=(shm,))
        p.start()
        processes.append(p)

    # Wait for all processes to complete
    for p in processes:
        p.join()

    # Print the final modified shared list
    print("Final shared list:", shm)

if __name__ == "__main__":
    main()

These examples cover various scenarios of using multiprocessing.shared_memory to share data between processes. Each example includes comments explaining key steps and demonstrates how to handle different types of shared memory objects (e.g., strings, integers, floats, lists).

queue - A synchronized queue class.md

queue - A synchronized queue class

The queue module provides a set of synchronization primitives that can be used to implement concurrent data structures such as queues, stacks, and priority queues. Here are comprehensive and well-documented code examples for each functionality in the queue module:

1. Basic Queue Example

This example demonstrates how to use a simple FIFO queue (FIFO - First In, First Out).

import queue

# Create a FIFO queue
fifo_queue = queue.Queue()

# Add items to the queue
fifo_queue.put(1)
fifo_queue.put(2)
fifo_queue.put(3)

# Process the queue in order
print("Processing elements from FIFO queue:")
while not fifo_queue.empty():
    item = fifo_queue.get()
    print(item)

# Output:
# Processing elements from FIFO queue:
# 1
# 2
# 3

2. Priority Queue Example

This example demonstrates how to use a priority queue (min-heap) where the smallest item is retrieved first.

import queue

# Create a min-heap priority queue
priority_queue = queue.PriorityQueue()

# Add items to the queue with priorities
priority_queue.put((3, 'bar'))
priority_queue.put((1, 'foo'))
priority_queue.put((2, 'baz'))

# Process the queue in order of priority
print("Processing elements from priority queue:")
while not priority_queue.empty():
    item = priority_queue.get()
    print(item)

# Output:
# Processing elements from priority queue:
# (1, 'foo')
# (2, 'baz')
# (3, 'bar')

3. LIFO Queue Example

This example demonstrates how to use a stack (LIFO - Last In, First Out).

import queue

# Create a stack (FIFO) using the `queue.Queue` class
stack = queue.Queue()

# Add items to the stack
stack.put(1)
stack.put(2)
stack.put(3)

# Process the stack in reverse order
print("Processing elements from stack:")
while not stack.empty():
    item = stack.get()
    print(item)

# Output:
# Processing elements from stack:
# 3
# 2
# 1

4. Double-Ended Queue Example

This example demonstrates how to use a deque (double-ended queue) which supports efficient appends and pops from both ends.

import queue

# Create a double-ended queue
deque = queue.deque()

# Add items to the front and back of the deque
deque.append(1)
deque.appendleft(2)
deque.append(3)
deque.appendleft(4)

# Process elements from both ends
print("Processing elements from deque:")
while len(deque) > 0:
    item = deque.popleft()
    print(item)

# Output:
# Processing elements from deque:
# 4
# 3
# 2
# 1

5. Custom Queue Example

This example demonstrates how to create a custom queue class using the queue.Queue class as a base.

import queue

class MyQueue(queue.Queue):
    def __init__(self, maxsize=0):
        super().__init__(maxsize)

    def get(self):
        # Custom behavior: print item before removing it
        item = super().get()
        print(f"Retrieved: {item}")
        return item

# Create a custom queue
custom_queue = MyQueue()

# Add items to the queue
custom_queue.put(1)
custom_queue.put(2)
custom_queue.put(3)

# Process the queue in order
print("Processing elements from custom queue:")
while not custom_queue.empty():
    item = custom_queue.get()
    print(item)

# Output:
# Processing elements from custom queue:
# Retrieved: 1
# 1
# Retrieved: 2
# 2
# Retrieved: 3
# 3

6. Queue with Priority

This example demonstrates how to use a priority queue that stores items along with their priority.

import queue

class PriorityItem:
    def __init__(self, priority, value):
        self.priority = priority
        self.value = value

    # Required for the priority queue to compare items by priority
    def __lt__(self, other):
        return self.priority < other.priority

# Create a min-heap priority queue with custom PriorityItem objects
priority_queue = queue.PriorityQueue()

# Add items to the queue with priorities
priority_queue.put(PriorityItem(3, 'bar'))
priority_queue.put(PriorityItem(1, 'foo'))
priority_queue.put(PriorityItem(2, 'baz'))

# Process the queue in order of priority
print("Processing elements from priority queue:")
while not priority_queue.empty():
    item = priority_queue.get()
    print(item.value)

# Output:
# Processing elements from priority queue:
# foo
# baz
# bar

These examples cover various aspects of using Python's queue module, including creating different types of queues and implementing custom behaviors. Each example is well-documented with comments explaining the purpose and functionality of each part of the code.

sched - Event scheduler.md

sched - Event scheduler

The sched module in Python is a simple event scheduler that allows you to schedule and run functions at specific times or intervals. Below are comprehensive examples of how to use the sched module, including comments explaining each step:

import sched
import time

# Initialize the scheduler
scheduler = sched.scheduler(time.time, time.sleep)

def print_time(sc):
    # This function prints the current time and schedules itself again after 1 second
    print("Current time:", time.ctime())
    scheduler.enter(1, 1, print_time, (sc,))

# Schedule the first call to print_time
scheduler.enter(0, 1, print_time, (scheduler,))

# Run the scheduler
try:
    while True:
        scheduler.run(blocking=False)
except KeyboardInterrupt:
    print("Scheduler stopped.")

Explanation:

  1. Initialize the Scheduler: We create an instance of sched.scheduler with time.time as the time function and time.sleep as the delay function. This means that the scheduler will use Python's built-in time functions for current time and delays.

  2. Define a Task Function: The print_time function is defined to print the current time and then schedule itself again after 1 second using the scheduler.enter method.

  3. Schedule the First Call: We schedule the first call to print_time immediately (0) with a priority of 1. This means it will be executed first.

  4. Run the Scheduler: The scheduler is run in an infinite loop, which continues until interrupted by a keyboard interrupt (Ctrl+C). Inside the loop, scheduler.run(blocking=False) runs one event at a time and returns immediately if there are no events to process, allowing other tasks to execute.

Key Features:

These examples provide a basic understanding of how to use the sched module to schedule and manage events in your Python applications.

subprocess - Subprocess management.md

subprocess - Subprocess management

The subprocess module in Python provides a way to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. Below are comprehensive examples demonstrating various functionalities of the subprocess module. These examples are designed to be clear, concise, and suitable for inclusion in official documentation.

Example 1: Running an External Command

import subprocess

# Example command to run 'ls -l'
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# Print the output of the command
print("Command Output:")
print(result.stdout)

# Check if the command was successful
if result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {result.stderr}")

Explanation: This example demonstrates how to use subprocess.run() to execute an external command. The ['ls', '-l'] list specifies the command and its arguments. The capture_output=True argument captures both standard output and error, and text=True ensures that the output is returned as a string instead of bytes. The result is then printed, and the script checks if the command was successful.

Example 2: Running a Command in a Separate Process

import subprocess

# Create a subprocess object to run 'echo Hello'
process = subprocess.Popen(['echo', 'Hello'], stdout=subprocess.PIPE)

# Read the output from the subprocess
output, _ = process.communicate()

# Print the output of the command
print("Command Output:")
print(output.decode('utf-8'))

# Check if the command was successful
if process.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {process.stderr}")

Explanation: This example shows how to use subprocess.Popen() to run a command in a separate process. The stdout=subprocess.PIPE argument allows reading the output of the command. The communicate() method is used to get both the standard output and error from the subprocess. The script decodes the output from bytes to a string before printing it.

Example 3: Handling Subprocess Input

import subprocess

# Create a subprocess object to run 'cat' with input piped in
process = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# Write input to the subprocess
input_data = "Hello, World!\n"
process.stdin.write(input_data.encode('utf-8'))

# Read the output from the subprocess
output, _ = process.communicate()

# Close the stdin after communicate
process.stdin.close()

# Print the output of the command
print("Command Output:")
print(output.decode('utf-8'))

# Check if the command was successful
if process.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {process.stderr}")

Explanation: This example demonstrates how to write input to a subprocess. The stdin=subprocess.PIPE argument allows writing input to the subprocess, and encode('utf-8') is used to convert the string to bytes before sending it to the process. The script reads the output from the subprocess and checks if the command was successful.

Example 4: Running Commands with Environment Variables

import subprocess

# Define environment variables
env = {
    'PATH': '/usr/local/bin',
    'MY_VAR': 'my_value'
}

# Run a command with specified environment variables
result = subprocess.run(['/bin/sh', '-c', 'echo $MY_VAR'], env=env, capture_output=True, text=True)

# Print the output of the command
print("Command Output:")
print(result.stdout)

# Check if the command was successful
if result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {result.stderr}")

Explanation: This example shows how to run a command with specified environment variables. The env dictionary is used to set environment variables for the subprocess. The $MY_VAR in the command string is replaced with its value from the environment.

Example 5: Running Commands in Parallel

import subprocess
import time

# List of commands to run in parallel
commands = [
    ['echo', 'Command1'],
    ['sleep', '2'],
    ['echo', 'Command3']
]

# Create and start processes for each command
processes = []
for cmd in commands:
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    processes.append(process)

# Wait for all processes to complete
for p in processes:
    output, _ = p.communicate()
    print(f"Output of {p.args}:")
    print(output.decode('utf-8'))
    print("Command executed successfully." if p.returncode == 0 else f"Error: {p.stderr}")

# Wait for all subprocesses to finish
for p in processes:
    p.wait()

Explanation: This example demonstrates how to run multiple commands in parallel using the subprocess module. Each command is executed in a separate process, and their outputs are captured. The script waits for all processes to complete before proceeding.

Example 6: Using check_output() for Simple Operations

import subprocess

# Use check_output() to run a simple command and capture its output
output = subprocess.check_output(['uname', '-a'], text=True)

# Print the output of the command
print("Output:")
print(output)

# Check if the command was successful
if subprocess.call(['uname', '-a']) == 0:
    print("Command executed successfully.")
else:
    print("Error: Command execution failed.")

Explanation: This example shows how to use subprocess.check_output() to run a simple command and capture its output. The function raises an exception if the command fails, making it convenient for checking the success of operations.

Example 7: Using run() with Timeout

import subprocess
import time

# Initialize the result variable
result = None

# Run a command with a timeout
try:
    result = subprocess.run(['sleep', '3'], timeout=2, capture_output=True, text=True)
except subprocess.TimeoutExpired as e:
    print("Command timed out.")
else:
    # Print the output of the command
    print("Command Output:")
    print(result.stdout)

# Check if the command was successful
if result and result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {result.stderr if result else 'No result available.'}")

Explanation: This example demonstrates how to run a command with a timeout using subprocess.run(). If the command takes longer than the specified timeout, it raises a TimeoutExpired exception. The script handles this exception and prints an appropriate message.

Example 8: Using run() with Custom Signal Handling

import subprocess
import os

# Run a command with custom signal handling
try:
    result = subprocess.run(['sleep', '10'], preexec_fn=os.setsid, capture_output=True, text=True)
except subprocess.TimeoutExpired as e:
    # Send the SIGTERM signal to the process group
    os.killpg(os.getpgid(result.pid), signal.SIGTERM)
    print("Command timed out. Sent SIGTERM.")
else:
    # Print the output of the command
    print("Command Output:")
    print(result.stdout)

# Check if the command was successful
if result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {result.stderr}")

Explanation: This example shows how to run a command with custom signal handling using subprocess.run(). The preexec_fn=os.setsid argument creates a new process group, and the script sends the SIGTERM signal to the entire process group if the command times out.

Example 9: Using run() with Background Execution

import subprocess
import time

# Run a command in the background
process = subprocess.Popen(['sleep', '5'], stdout=subprocess.PIPE)

# Wait for the process to complete
output, _ = process.communicate()

# Print the output of the command
print("Command Output:")
print(output.decode('utf-8'))

# Check if the command was successful
if process.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {process.stderr}")

Explanation: This example demonstrates how to run a command in the background using subprocess.Popen(). The process is executed without waiting for it to complete, and the output is captured using communicate().

Example 10: Using run() with Multiple Arguments

import subprocess

# Run a command with multiple arguments
result = subprocess.run(['echo', 'Hello', 'World'], capture_output=True, text=True)

# Print the output of the command
print("Command Output:")
print(result.stdout)

# Check if the command was successful
if result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Error: {result.stderr}")

Explanation: This example shows how to run a command with multiple arguments using subprocess.run(). The list ['echo', 'Hello', 'World'] specifies the command and its arguments.

These examples cover various aspects of the subprocess module, including running commands, handling input/output, environment variables, parallel execution, error handling, and more. Each example is designed to be clear and concise, making it suitable for inclusion in a broader discussion or usage guide.

threading - Thread-based parallelism.md

threading - Thread-based parallelism

Below are comprehensive and well-documented code examples for various functionalities of the threading module in Python. Each example is designed to be clear, concise, and follows best practices suitable for inclusion in official documentation.

1. Creating and Starting Threads

import threading
import time

def worker():
    """Example worker function that sleeps for a random amount of time."""
    import random
    sleep_time = random.uniform(1, 3)
    print(f"Thread {threading.current_thread().name} sleeping for {sleep_time:.2f} seconds")
    time.sleep(sleep_time)

# Create and start multiple threads
threads = []
for i in range(5):
    thread = threading.Thread(target=worker, name=f'Thread-{i+1}')
    threads.append(thread)
    thread.start()

# Wait for all threads to complete
for thread in threads:
    thread.join()

Explanation: - The worker function simulates a task that takes a random amount of time to execute. - We create multiple threads, each running the worker function. Each thread has a unique name. - We start each thread using the start() method. - Finally, we use join() on each thread to ensure all threads have completed before proceeding.

2. Synchronizing Threads with Locks

import threading
import time

# Shared resource
shared_resource = 0
lock = threading.Lock()

def increment():
    """Increment the shared resource using a lock."""
    global shared_resource
    for _ in range(100):
        # Acquire the lock before modifying the shared resource
        with lock:
            shared_resource += 1
        time.sleep(0.001)  # Simulate some processing

# Create and start multiple threads that increment the shared resource
threads = []
for i in range(5):
    thread = threading.Thread(target=increment)
    threads.append(thread)
    thread.start()

# Wait for all threads to complete
for thread in threads:
    thread.join()

print(f"Final value of shared_resource: {shared_resource}")

Explanation: - We use a Lock to ensure that only one thread can modify the shared resource at a time, preventing race conditions. - The increment function repeatedly increments the shared resource while holding the lock. This ensures that each increment operation is atomic. - Multiple threads are created and started to perform concurrent modifications.

3. Using Condition Variables

import threading
import time

# Shared resources
condition = threading.Condition()
shared_resource = []

def producer():
    """Producer thread that adds items to the shared list."""
    for i in range(10):
        with condition:
            shared_resource.append(f"Item {i}")
            print(f"Produced: {i}")
            condition.notify()  # Notify one waiting consumer
        time.sleep(0.5)

def consumer():
    """Consumer thread that takes items from the shared list."""
    while True:
        with condition:
            while not shared_resource:
                condition.wait()  # Wait if no item is available
            item = shared_resource.pop()
            print(f"Consumed: {item}")
            condition.notify()  # Notify one producer

# Create and start threads
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)

producer_thread.start()
consumer_thread.start()

# Wait for both threads to complete
producer_thread.join()
consumer_thread.join()

Explanation: - A Condition object is used to synchronize access to the shared list. - The producer thread adds items to the list and notifies a waiting consumer. Similarly, the consumer waits until an item is available in the list before consuming it.

4. Using Semaphore

import threading
import time

# Shared resource with semaphore control
semaphore = threading.Semaphore(3)
shared_resource = []

def producer():
    """Producer thread that adds items to the shared list."""
    for i in range(10):
        with semaphore:
            shared_resource.append(f"Item {i}")
            print(f"Produced: {i}")
        time.sleep(0.5)

def consumer():
    """Consumer thread that takes items from the shared list."""
    while True:
        with semaphore:
            if not shared_resource:
                continue
            item = shared_resource.pop()
            print(f"Consumed: {item}")

# Create and start threads
producer_thread = threading.Thread(target=producer)
consumer_thread1 = threading.Thread(target=consumer)
consumer_thread2 = threading.Thread(target=consumer)

producer_thread.start()
consumer_thread1.start()
consumer_thread2.start()

# Wait for both producer and consumer threads to complete
producer_thread.join()
consumer_thread1.join()
consumer_thread2.join()

Explanation: - A Semaphore is used to limit the number of concurrent access to a shared resource. In this example, up to 3 producers can write to the list at a time. - The consumers wait until there are items in the list before consuming them.

5. Using Event Objects

import threading
import time

# Shared event object
event = threading.Event()
shared_resource = None

def producer():
    """Producer thread that sets the shared resource and signals the event."""
    for i in range(10):
        item = f"Item {i}"
        print(f"Produced: {item}")
        shared_resource = item
        event.set()  # Signal the consumer that an item is ready
        time.sleep(0.5)

def consumer():
    """Consumer thread that waits for the event to be set and processes the shared resource."""
    event.wait()  # Wait until the producer signals
    print(f"Consumed: {shared_resource}")

# Create and start threads
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)

producer_thread.start()
consumer_thread.start()

# Wait for both threads to complete
producer_thread.join()
consumer_thread.join()

Explanation: - An Event object is used to coordinate between the producer and consumer. The producer sets the event when it has a new item, and the consumer waits until the event is set before processing the resource.

These examples cover various aspects of using threads in Python, including thread creation, synchronization with locks, condition variables, semaphores, and events. Each example is self-contained and demonstrates best practices for handling concurrent programming tasks.

Cryptographic Services

hashlib - Secure hashes and message digests.md

hashlib - Secure hashes and message digests

The hashlib module in Python provides access to secure hash and message digest algorithms. It is part of the Python Standard Library, making it a fundamental tool for cryptographic operations. Below are comprehensive examples demonstrating various functionalities provided by the hashlib module.

Example 1: Creating a Hash Object

import hashlib

# Create a SHA-256 hash object
sha256_hash = hashlib.sha256()

# Update the hash object with some data
sha256_hash.update(b"Hello, World!")

# Get the hexadecimal representation of the hash
hex_digest = sha256_hash.hexdigest()
print("SHA-256 Hash:", hex_digest)

Explanation: This example demonstrates how to create a SHA-256 hash object using hashlib.sha256(). It then updates the hash with the byte string "Hello, World!" and retrieves the hexadecimal representation of the resulting hash.

Example 2: Creating Multiple Hash Objects

import hashlib

# Create multiple hash objects for different algorithms
md5_hash = hashlib.md5()
sha1_hash = hashlib.sha1()

# Update each hash object with some data
md5_hash.update(b"Secure hash and message digest")
sha1_hash.update(b"Secure hash and message digest")

# Get the hexadecimal representation of each hash
md5_hex_digest = md5_hash.hexdigest()
sha1_hex_digest = sha1_hash.hexdigest()

print("MD5 Hash:", md5_hex_digest)
print("SHA-1 Hash:", sha1_hex_digest)

Explanation: This example shows how to create multiple hash objects for different algorithms (MD5 and SHA-1) using hashlib.md5() and hashlib.sha1(), respectively. It updates each hash object with the byte string "Secure hash and message digest" and retrieves the hexadecimal representation of each resulting hash.

Example 3: Using Hash Objects in a Context Manager

import hashlib
from contextlib import contextmanager

@contextmanager
def compute_hash(algorithm):
    # Create a hash object using the specified algorithm
    hasher = hashlib.new(algorithm)

    try:
        yield hasher
    finally:
        # Update the hash with the bytes from the buffer
        hasher.update(b"Secure hash and message digest")
        print(f"{algorithm.capitalize()} Hash:", hasher.hexdigest())

# Use the context manager to compute a SHA-256 hash
with compute_hash("sha256") as sha256:
    pass

Explanation: This example demonstrates how to use the hashlib.new() function with a context manager (contextlib.contextmanager) to create a hash object for a specified algorithm. The hash object is updated with the byte string "Secure hash and message digest" in the context, and the final hexadecimal representation of the hash is printed upon exit.

Example 4: Using Hash Objects with Input Streams

import hashlib
from io import BytesIO

# Create a hash object using SHA-256
sha256_hash = hashlib.sha256()

# Create an input stream from a byte string
input_stream = BytesIO(b"Secure hash and message digest")

# Update the hash with data from the input stream
sha256_hash.update(input_stream.read())

# Get the hexadecimal representation of the hash
hex_digest = sha256_hash.hexdigest()
print("SHA-256 Hash from Stream:", hex_digest)

# Reset the input stream for re-use
input_stream.seek(0)

Explanation: This example shows how to create a SHA-256 hash object and update it with data read from an io.BytesIO object. The hash is then finalized, and the hexadecimal representation of the hash is printed. The input stream is reset for re-use.

Example 5: Using Hash Objects with Binary Files

import hashlib
from pathlib import Path

# Create a hash object using MD5
md5_hash = hashlib.md5()

# Open a binary file in read mode
with open(Path("example.txt"), "rb") as file:
    # Update the hash object with data from the file
    md5_hash.update(file.read())

# Get the hexadecimal representation of the hash
hex_digest = md5_hash.hexdigest()
print("MD5 Hash from File:", hex_digest)

Explanation: This example demonstrates how to create an MD5 hash object and update it with data read from a binary file using Path for file path handling. The hash is then finalized, and the hexadecimal representation of the hash is printed.

Example 6: Using Hash Objects with Custom Algorithms

import hashlib

# Define a custom hash algorithm (e.g., MD5-like)
def custom_hash(data):
    # Create an MD5 hash object
    md5_hash = hashlib.md5()

    # Update the hash object with the data
    md5_hash.update(data)

    # Return the hexadecimal representation of the hash
    return md5_hash.hexdigest()

# Use the custom hash function
custom_hex_digest = custom_hash(b"Custom hash example")
print("Custom Hash:", custom_hex_digest)

Explanation: This example demonstrates how to define a custom hash algorithm by creating an MD5 hash object and updating it with a given byte string. The hexadecimal representation of the custom hash is then printed.

Example 7: Using Hash Objects with Different Data Types

import hashlib

# Create a SHA-256 hash object
sha256_hash = hashlib.sha256()

# Update the hash object with integers, floats, and strings
sha256_hash.update(12345)
sha256_hash.update(3.14)
sha256_hash.update("Hello, World!")

# Get the hexadecimal representation of the hash
hex_digest = sha256_hash.hexdigest()
print("SHA-256 Hash with Mixed Data Types:", hex_digest)

Explanation: This example shows how to create a SHA-256 hash object and update it with integers (12345), floats (3.14), and strings ("Hello, World!"). The hash is then finalized, and the hexadecimal representation of the mixed data types hash is printed.

These examples cover various aspects of using the hashlib module, including creating different hash objects, updating them with different inputs, and using hash objects in context managers and streams.

hmac - Keyed-Hashing for Message Authentication.md

hmac - Keyed-Hashing for Message Authentication

The hmac module in Python provides a way to create message authentication codes (MACs) using cryptographic hash functions such as SHA-1, SHA-256, etc. A MAC is a fixed-size binary value that verifies the integrity of a message and ensures it hasn't been tampered with during transmission or storage.

Below are comprehensive examples for various functionalities in the hmac module:

Example 1: Creating an HMAC Using SHA-256

import hmac
import hashlib

# Define a secret key and a message
secret_key = b'secret_key'
message = b'This is a test message'

# Create an HMAC object using SHA-256 and the secret key
hmac_obj = hmac.new(secret_key, msg=message, digestmod=hashlib.sha256)

# Calculate and print the MAC value
mac_value = hmac_obj.digest()
print(f"SHA-256 HMAC: {mac_value.hex()}")

Example 2: Creating an HMAC Using SHA-1

import hmac
import hashlib

# Define a secret key and a message
secret_key = b'secret_key'
message = b'This is a test message'

# Create an HMAC object using SHA-1 and the secret key
hmac_obj = hmac.new(secret_key, msg=message, digestmod=hashlib.sha1)

# Calculate and print the MAC value
mac_value = hmac_obj.digest()
print(f"SHA-1 HMAC: {mac_value.hex()}")

Example 3: Verifying an HMAC

import hmac
import hashlib

# Define a secret key and a message
secret_key = b'secret_key'
message = b'This is a test message'

# Calculate the expected MAC value using SHA-256
expected_mac_value = b'expected_mac_value'  # Replace with the actual expected MAC value

# Create an HMAC object using SHA-256 and the secret key
hmac_obj = hmac.new(secret_key, msg=message, digestmod=hashlib.sha256)

# Calculate the actual MAC value
actual_mac_value = hmac_obj.digest()

# Verify if the calculated MAC matches the expected MAC
if hmac.compare_digest(actual_mac_value, expected_mac_value):
    print("The HMAC is valid.")
else:
    print("The HMAC is invalid.")

Example 4: Using hmac.compare_digest for Safe Comparison

import hmac

# Define two MAC values to compare safely
mac1 = b'6c967015e832e1d8f9b7b21a45d8b238'
mac2 = b'6c967015e832e1d8f9b7b21a45d8b238'

# Compare the MACs safely
if hmac.compare_digest(mac1, mac2):
    print("The MACs are identical.")
else:
    print("The MACs differ.")

# Note: Use `hmac.compare_digest` to securely compare MACs to prevent timing attacks.

Example 5: Creating an HMAC with Additional Data

import hmac
import hashlib

# Define a secret key, message, and additional data
secret_key = b'secret_key'
message = b'This is a test message'
additional_data = b'Additional information'

# Create an HMAC object using SHA-256 and the secret key, including additional data
hmac_obj = hmac.new(secret_key, msg=message + additional_data, digestmod=hashlib.sha256)

# Calculate and print the MAC value
mac_value = hmac_obj.digest()
print(f"SHA-256 HMAC with additional data: {mac_value.hex()}")

These examples demonstrate how to use the hmac module to create, calculate, verify, and compare HMAC values securely. Each example is well-documented with comments explaining the purpose of each part of the code.

secrets - Generate secure random numbers for managing secrets.md

secrets - Generate secure random numbers for managing secrets

Below are comprehensive and well-documented code examples for various functionalities of the secrets module, which is used to generate cryptographically strong random numbers suitable for managing data such as passwords, account authentication, tokens, and related secrets.

1. Generating a Secure Random Integer

import secrets
import random

# Generate a secure random integer between 'a' (inclusive) and 'b' (exclusive)
secure_int = secrets.randbelow(100)
print(f"Secure Random Integer: {secure_int}")

# Generate a secure random integer within a specified range, inclusive
secure_int_inclusive = random.randint(1, 100)
print(f"Secure Random Integer Inclusive: {secure_int_inclusive}")

2. Generating a Secure Random Float

import secrets
import random

# Generate a secure random float between 0.0 (inclusive) and 1.0 (exclusive)
secure_float = random.random()
print(f"Secure Random Float: {secure_float}")

# Generate a secure random float within a specified range, inclusive
secure_float_inclusive = random.uniform(0.0, 1.0)
print(f"Secure Random Float Inclusive: {secure_float_inclusive}")

3. Generating a Secure Random Bytes

import secrets

# Generate a secure random byte string of a specified length
secure_bytes = secrets.token_bytes(16)
print(f"Secure Random Bytes: {secure_bytes}")

# Convert the bytes to a hexadecimal string for easier readability
secure_hex_string = secure_bytes.hex()
print(f"Secure Hex String: {secure_hex_string}")

4. Generating a Secure Random Token

import secrets

# Generate a secure random token of a specified length, which is useful for authentication tokens
token_length = 16
secure_token = secrets.token_urlsafe(token_length)
print(f"Secure Token (URL-safe): {secure_token}")

# Alternatively, you can use the bytes version if needed
secure_token_bytes = secrets.token_bytes(token_length)
print(f"Secure Token (Bytes): {secure_token_bytes.hex()}")

5. Generating a Secure Random UUID

import secrets
import uuid

# Generate a secure random UUID
secure_uuid = uuid.uuid4()
print(f"Secure UUID: {secure_uuid}")

# Generate a secure random node-based UUID
secure_node_based_uuid = uuid.uuid1()
print(f"Secure Node-Based UUID: {secure_node_based_uuid}")

6. Generating a Secure Random Hexadecimal String

import secrets

# Generate a secure random hexadecimal string of a specified length
hex_length = 32
secure_hex_string = secrets.token_hex(hex_length)
print(f"Secure Hexadecimal String: {secure_hex_string}")

# Convert the hex string to bytes for easier manipulation if needed
secure_hex_bytes = bytes.fromhex(secure_hex_string)
print(f"Secure Hex Bytes: {secure_hex_bytes}")

7. Generating a Secure Random Alphanumeric String

import secrets
import string

# Define the character set (lowercase, uppercase, and digits)
characters = string.ascii_letters + string.digits

# Generate a secure random alphanumeric string of a specified length
alphanumeric_length = 20
secure_alphanumeric_string = ''.join(secrets.choice(characters) for _ in range(alphanumeric_length))
print(f"Secure Alphanumeric String: {secure_alphanumeric_string}")

Explanation

These examples demonstrate how to use various functionalities of the secrets module to generate secure random numbers and strings suitable for managing secrets.

Custom Python Interpreters

code - Interpreter base classes.md

code - Interpreter base classes

The code module in Python is a low-level interface to the interactive interpreter's bytecode execution environment. This module provides a way to create, manipulate, and execute code objects, which are used by the Python interpreter itself.

Below are comprehensive examples for each functionality provided by the code module:

1. Creating a Code Object

import code

# Define a simple function using a string representation of code
source_code = """
def add(a, b):
    return a + b
"""

# Create a code object from the source code string
code_obj = compile(source_code, '<string>', 'exec')

# Print the type of the code object
print(type(code_obj))  # <class 'types.CodeType'>

2. Executing Code Objects

import code

# Define a simple function using a string representation of code
source_code = """
def multiply(a, b):
    return a * b
"""

# Create a code object from the source code string
code_obj = compile(source_code, '<string>', 'exec')

# Execute the code object in a new namespace
namespace = {}
exec(code_obj, namespace)

# Access the function defined by the code object
multiply_function = namespace['multiply']

# Call the function and print the result
result = multiply_function(3, 4)
print(result)  # Output: 12

3. Creating a Compiled Code Object

import code

# Define a simple function using a string representation of code
source_code = """
def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("division by zero")
    return a / b
"""

# Create a compiled code object from the source code string
code_obj = compile(source_code, '<string>', 'exec')

# Execute the compiled code object in a new namespace
namespace = {}
eval(code_obj, namespace)

# Access the function defined by the compiled code object
divide_function = namespace['divide']

# Call the function and print the result
result = divide_function(10, 2)
print(result)  # Output: 5.0

try:
    result = divide_function(10, 0)
except ZeroDivisionError as e:
    print(e)  # Output: division by zero

4. Creating a Code Object with Line Numbers

import code

# Define a simple function using a string representation of code
source_code = """
def add(a, b):
    return a + b
"""

# Create a code object from the source code string with line numbers
code_obj = compile(source_code, '<string>', 'exec')

# Print the code object to see line numbers
print(code_obj)  # Output: <code object at 0x7f9c5b1d2e08>

5. Creating a Code Object with Constants

import code

# Define a simple function using a string representation of code with constants
source_code = """
def factorial(n):
    if n == 0:
        return 1
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
"""

# Create a code object from the source code string with constants
code_obj = compile(source_code, '<string>', 'exec')

# Execute the code object in a new namespace
namespace = {}
eval(code_obj, namespace)

# Access the function defined by the code object
factorial_function = namespace['factorial']

# Call the function and print the result
result = factorial_function(5)
print(result)  # Output: 120

6. Creating a Code Object with Variables

import code

# Define a simple function using a string representation of code with variables
source_code = """
def calculate(a, b):
    return a + b, a - b, a * b, a / b
"""

# Create a code object from the source code string with variables
code_obj = compile(source_code, '<string>', 'exec')

# Execute the code object in a new namespace
namespace = {'a': 10, 'b': 5}
eval(code_obj, namespace)

# Access the function defined by the code object and its results
calculate_function = namespace['calculate']
result = calculate_function(namespace['a'], namespace['b'])

print(result)  # Output: (15, 5, 50, 2.0)

Conclusion

The code module provides a low-level interface to Python's bytecode execution environment, allowing developers to create and manipulate code objects. These examples demonstrate how to use the code module to compile and execute code in different ways, including handling constants, variables, and line numbers.

This documentation should be suitable for inclusion in official Python documentation, providing clear explanations and practical examples of each feature.

codeop - Compile Python code.md

codeop - Compile Python code

The codeop module in Python is used to compile Python source code into bytecode, which can then be executed by the CPython interpreter. This can be useful for various purposes such as parsing and transforming code or optimizing it before execution.

Here are comprehensive examples demonstrating different functionalities of the codeop module:

import codeop

# Function to compile a string of Python code into bytecode
def compile_code(code_string):
    # Use codeop.compile_command() to compile the code string
    try:
        compiled_code = codeop.compile_command(code_string)
        return compiled_code
    except SyntaxError as e:
        print(f"Syntax error: {e}")
        return None

# Example usage of compile_code()
code_to_compile = """
def hello_world():
    print("Hello, World!")
"""

compiled_result = compile_code(code_to_compile)

if compiled_result:
    # Execute the compiled bytecode
    exec(compiled_result)

Explanation:

  1. compile_command() Function: This function is used to compile a string of Python code into a compiled object (a code instance). It processes the input string according to the rules of the Python grammar and compiles it into bytecode.

  2. Error Handling: The example includes basic error handling to catch and print syntax errors when the input code does not conform to Python's syntax rules.

  3. Executing Compiled Code: Once compiled, you can execute the bytecode using exec(). This function takes a compiled object and evaluates its contents in the current scope.

Additional Examples:

Example 2: Compiling and Executing Multiple Statements

# String containing multiple statements
multiple_statements = """
x = 10
y = 20
z = x + y
print(z)
"""

compiled_result_multiple = compile_code(multiple_statements)

if compiled_result_multiple:
    exec(compiled_result_multiple)

Example 3: Using compile() Function

The codeop module also provides a direct way to use the built-in compile() function from Python's standard library.

# String containing Python code
another_code = "a = [1, 2, 3]; b = a + [4, 5]; print(b)"

compiled_result_direct = compile(another_code, "<string>", "exec")

if compiled_result_direct:
    exec(compiled_result_direct)

Example 4: Compiling and Executing Code with Specific Mode

You can specify the mode of compilation using the mode parameter in the compile() function. This allows you to differentiate between statement execution ("exec"), expression evaluation ("eval"), or module creation ("single").

# String containing Python code
code_for_module = """
def my_function():
    return "Hello, from a module!"
"""

compiled_result_module = compile(code_for_module, "<module>", "single")

if compiled_result_module:
    # This will create a module object and execute the code inside it
    exec(compiled_result_module)

Explanation:

These examples demonstrate various ways to use the codeop module for compiling and executing Python code, covering different scenarios such as executing multiple statements, using built-in functions, and handling errors gracefully.

Data Compression and Archiving

bz2 - Support for bzip2 compression.md

bz2 - Support for bzip2 compression

Here are comprehensive code examples for the bz2 module in Python, which provides support for bzip2 compression:

1. Compressing a String

import bz2

def compress_string(input_string):
    """
    Compresses a given string using the bzip2 algorithm.

    Args:
        input_string (str): The string to be compressed.

    Returns:
        bytes: The compressed data.
    """
    # Convert the string to bytes if it isn't already
    if not isinstance(input_string, bytes):
        input_bytes = input_string.encode('utf-8')
    else:
        input_bytes = input_string

    # Compress the bytes using bz2
    compressed_data = bz2.compress(input_bytes)

    return compressed_data

# Example usage
original_text = "This is a sample text to be compressed using bzip2."
compressed = compress_string(original_text)
print("Original Length:", len(original_text))
print("Compressed Length:", len(compressed))

2. Decompressing a Byte String

import bz2

def decompress_bytes(compressed_data):
    """
    Decompresses a compressed byte string using the bzip2 algorithm.

    Args:
        compressed_data (bytes): The compressed data to be decompressed.

    Returns:
        bytes: The decompressed data.
    """
    # Decompress the bytes using bz2
    decompressed_bytes = bz2.decompress(compressed_data)

    return decompressed_bytes

# Example usage
compressed_data = b"1HjBkLmNpQrStUvWxYz01hJkLmNpQrStUvWxYz"
original_text = decompress_bytes(compressed_data)
print("Decompressed Text:", original_text.decode('utf-8'))

3. Writing Compressed Data to a File

import bz2

def write_compressed_to_file(input_string, filename):
    """
    Writes the compressed version of a string to a file using bzip2.

    Args:
        input_string (str): The string to be compressed and written.
        filename (str): The name of the file to write to.
    """
    # Compress the string
    compressed_data = compress_string(input_string)

    # Open the file in binary write mode and write the compressed data
    with open(filename, 'wb') as file:
        file.write(compressed_data)

# Example usage
input_text = "This is a sample text to be written to a bzip2-compressed file."
write_compressed_to_file(input_text, 'compressed_output.bz2')

4. Reading Compressed Data from a File

import bz2

def read_compressed_from_file(filename):
    """
    Reads compressed data from a file and returns the decompressed string.

    Args:
        filename (str): The name of the file containing the compressed data.

    Returns:
        str: The decompressed string.
    """
    # Open the file in binary read mode
    with open(filename, 'rb') as file:
        compressed_data = file.read()

    # Decompress the bytes
    decompressed_bytes = decompress_bytes(compressed_data)

    return decompressed_bytes.decode('utf-8')

# Example usage
filename = 'compressed_output.bz2'
original_text = read_compressed_from_file(filename)
print("Original Text:", original_text)

5. Handling Compressed Data in a Streaming Context

import bz2

def stream_compress(input_stream, output_stream):
    """
    Streams the compression of data from an input stream to an output stream.

    Args:
        input_stream (io.BytesIO): The input stream containing the data to be compressed.
        output_stream (io.BytesIO): The output stream to write the compressed data.
    """
    # Compress the input stream and write it to the output stream
    with bz2.BZ2Compressor() as compressor:
        while True:
            chunk = input_stream.read(1024)
            if not chunk:
                break
            output_stream.write(compressor.compress(chunk))

# Example usage
input_bytes = b"1HjBkLmNpQrStUvWxYz01hJkLmNpQrStUvWxYz"
with io.BytesIO(input_bytes) as input_buffer, io.BytesIO() as output_buffer:
    stream_compress(input_buffer, output_buffer)
    compressed_data = output_buffer.getvalue()
print("Compressed Data:", compressed_data)

# Decompression example
output_buffer.seek(0)
decompressed_data = decompress_bytes(output_buffer.read())
print("Decompressed Data:", decompressed_data.decode('utf-8'))

6. Using bz2.BZ2File for File Operations

import bz2

def read_bz2_file(filename):
    """
    Reads data from a bzip2-compressed file and returns the decompressed string.

    Args:
        filename (str): The name of the bzip2-compressed file to read.

    Returns:
        str: The decompressed string.
    """
    # Open the file in binary read mode
    with bz2.BZ2File(filename, 'r') as bz2_file:
        return bz2_file.read().decode('utf-8')

def write_bz2_file(input_string, filename):
    """
    Writes a compressed version of a string to a bzip2-compressed file.

    Args:
        input_string (str): The string to be compressed and written.
        filename (str): The name of the bzip2-compressed file to write to.
    """
    # Open the file in binary write mode
    with bz2.BZ2File(filename, 'w') as bz2_file:
        bz2_file.write(input_string.encode('utf-8'))

# Example usage
input_text = "This is a sample text to be written to a bzip2-compressed file."
write_bz2_file(input_text, 'compressed_output.bz2')
print("Written Text:", read_bz2_file('compressed_output.bz2'))

7. Handling Large Files Efficiently

import bz2
import io

def compress_large_file(input_filename, output_filename):
    """
    Compresses a large file using bzip2 in chunks.

    Args:
        input_filename (str): The name of the large file to be compressed.
        output_filename (str): The name of the compressed file to write.
    """
    # Open the large file in binary read mode
    with open(input_filename, 'rb') as input_file, bz2.BZ2File(output_filename, 'w') as output_file:
        while True:
            chunk = input_file.read(1024 * 1024)  # Read 1MB chunks
            if not chunk:
                break
            output_file.write(chunk)

def decompress_large_file(input_filename, output_filename):
    """
    Decompresses a large bzip2-compressed file into another.

    Args:
        input_filename (str): The name of the compressed file to read.
        output_filename (str): The name of the decompressed file to write.
    """
    # Open the compressed file in binary read mode
    with bz2.BZ2File(input_filename, 'rb') as bz2_file, open(output_filename, 'wb') as output_file:
        while True:
            chunk = bz2_file.read(1024 * 1024)  # Read 1MB chunks
            if not chunk:
                break
            output_file.write(chunk)

# Example usage
input_large_file = 'large_input.txt'
output_compressed_file = 'compressed_large_output.bz2'
compress_large_file(input_large_file, output_compressed_file)
print("Compressed Large File:", output_compressed_file)

output_decompressed_file = 'decompressed_large_output.txt'
decompress_large_file(output_compressed_file, output_decompressed_file)
print("Decompressed Large File:", output_decompressed_file)

These examples cover various aspects of using the bz2 module, including basic compression and decompression operations, handling large files efficiently, and working with streams. Each example is designed to be clear and self-contained, making it easy to integrate into a larger project or documentation.

gzip - Support for gzip files.md

gzip - Support for gzip files

The gzip module provides support for reading from and writing to .gz (gzip) compressed files. Below are comprehensive examples of how to use this module, including functions for both reading and writing files.

Writing Gzip Files

import gzip

def write_to_gz_file(file_path, data):
    """
    Write data to a gzip file.

    :param file_path: Path to the gzip file.
    :param data: Data to be written into the gzip file.
    """
    with gzip.open(file_path, 'wb') as f:
        # Writing bytes directly is common for gzip files
        f.write(data.encode('utf-8'))

# Example usage
data_to_write = "This is some text that will be compressed and saved to a gzip file."
write_to_gz_file('example.gz', data_to_write)

Reading Gzip Files

import gzip

def read_from_gz_file(file_path):
    """
    Read data from a gzip file.

    :param file_path: Path to the gzip file.
    :return: The content of the gzip file as a string.
    """
    with gzip.open(file_path, 'rb') as f:
        # Reading bytes and decoding back to string
        return f.read().decode('utf-8')

# Example usage
file_content = read_from_gz_file('example.gz')
print(file_content)

Compressing Data

import gzip

def compress_data(data):
    """
    Compress data using gzip.

    :param data: The data to be compressed.
    :return: A bytes object containing the compressed data.
    """
    # Using gzip.compress() to compress a byte string
    return gzip.compress(data.encode('utf-8'))

# Example usage
original_data = "This is some text that will be compressed."
compressed_data = compress_data(original_data)
print(f"Compressed Data Length: {len(compressed_data)} bytes")

Decompressing Data

import gzip

def decompress_data(compressed_data):
    """
    Decompress data using gzip.

    :param compressed_data: A bytes object containing the compressed data.
    :return: The original content as a string.
    """
    # Using gzip.decompress() to decompress a byte string
    return gzip.decompress(compressed_data).decode('utf-8')

# Example usage
compressed_bytes = compress_data("This is some text that will be compressed.")
decompressed_text = decompress_data(compressed_bytes)
print(decompressed_text)

Handling Errors

import gzip

def handle_gzip_error(file_path):
    """
    Handle errors when reading from or writing to a gzip file.

    :param file_path: Path to the gzip file.
    """
    try:
        with gzip.open(file_path, 'rb') as f:
            # Attempt to read data from a gzip file
            content = f.read().decode('utf-8')
            print(content)
    except FileNotFoundError:
        print(f"Error: The file {file_path} does not exist.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
handle_gzip_error('non_existent_file.gz')

Additional Examples

Writing and Reading Multiple Files

import gzip

def write_multiple_files(file_paths, data_list):
    """
    Write multiple pieces of data to different gzip files.

    :param file_paths: List of paths for the gzip files.
    :param data_list: List of data strings to be written into the gzip files.
    """
    if len(file_paths) != len(data_list):
        raise ValueError("The number of file paths must match the number of data items.")

    with gzip.open(file_paths[0], 'wb') as f:
        # Writing bytes directly is common for gzip files
        f.write(data_list[0].encode('utf-8'))

    for i, (file_path, data) in enumerate(zip(file_paths[1:], data_list[1:])):
        with gzip.open(file_path, 'wb') as f:
            f.write(data.encode('utf-8'))

# Example usage
data_list = ["First file content", "Second file content"]
write_multiple_files(['first_file.gz', 'second_file.gz'], data_list)

Compressing and Decompressing Multiple Files

import gzip

def compress_multiple_files(file_paths):
    """
    Compress multiple files into a single gzip archive.

    :param file_paths: List of paths to the files to be compressed.
    """
    with gzip.open('archive.gz', 'wb') as outfile:
        for infile_path in file_paths:
            with open(infile_path, 'rb') as infile:
                outfile.write(inf.read())

# Example usage
compress_multiple_files(['file1.txt', 'file2.txt'])

These examples cover the basic functionalities of the gzip module, including reading from, writing to, compressing, and decompressing gzip files. They also demonstrate error handling and how to work with multiple files in a single operation.

lzma - Compression using the LZMA algorithm.md

lzma - Compression using the LZMA algorithm

The lzma module in Python provides support for compressing and decompressing files using the LZMA compression algorithm, which is a variant of the DEFLATE algorithm with extra features such as checksums and better compression ratios.

Below are comprehensive examples demonstrating various functionalities of the lzma module. These examples are designed to be clear, concise, and suitable for inclusion in official documentation.

Example 1: Compressing Data Using LZMA

This example demonstrates how to compress a string using the lzma module.

import lzma

# Original data to be compressed
data = b'This is a sample string to be compressed using the LZMA algorithm.'

# Compress the data
compressed_data = lzma.compress(data)

# Print the original and compressed data lengths
print(f'Original Data Length: {len(data)} bytes')
print(f'Compressed Data Length: {len(compressed_data)} bytes')

# Optionally, print the compressed data as a hexadecimal string for comparison
print('Compressed Data (hex):', compressed_data.hex())

Example 2: Decompressing Data Using LZMA

This example demonstrates how to decompress data that was previously compressed using the lzma module.

import lzma

# Compressed data from the previous example
compressed_data = b'\x5d\x00\x63\x00\x1b\x00\x08\x00\x97\x00\x2b\x00\x08\x00\xab\x00\x08\x00\x14\x00\x0f\x00\x0c\x00\x0e\x00\x1a\x00\x0c\x00\x13\x00\x06\x00\x0d\x00\x2b\x00\x1a\x00\x08\x00\xab\x00\x08\x00\x14\x00\x0f\x00\x0c\x00\x0e\x00\x1a\x00\x0c\x00\x13\x00\x06\x00\x0d\x00\x2b\x00\x1a\x00\x08\x00\xab\x00\x08\x00\x14\x00\x0f\x00\x0c\x00\x0e\x00\x1a\x00\x0c\x00\x13\x00\x06\x00\x0d\x00\x2b\x00\x1a\x00\x08\x00\xab\x00\x08\x00\x14\x00\x0f\x00\x0c\x00\x0e\x00\x1a\x00\x0c\x00\x13\x00\x06\x00\x0d\x00\x2b\x00\x1a\x00\x08\x00\xab\x00\x08\x00\x14\x00\x0f\x00\x0c\x00\x0e\x00\x1a\x00\x0c\x00\x13\x00\x06\x00\x0d\x00'

# Decompress the data
decompressed_data = lzma.decompress(compressed_data)

# Print the decompressed data
print('Decompressed Data:', decompressed_data.decode('utf-8'))

Example 3: Using Compression Levels

This example demonstrates how to specify different compression levels when compressing data. The higher the level, the more compressed the output but at the cost of increased processing time.

import lzma

# Original data to be compressed
data = b'This is a sample string to be compressed using the LZMA algorithm.'

# Compress data with different levels (0-9)
compressed_data_level_0 = lzma.compress(data, level=0)  # No compression
compressed_data_level_1 = lzma.compress(data, level=1)  # Basic compression
compressed_data_level_9 = lzma.compress(data, level=9)  # Maximum compression

# Print the lengths of compressed data for each level
print(f'Compressed Data (Level 0): {len(compressed_data_level_0)} bytes')
print(f'Compressed Data (Level 1): {len(compressed_data_level_1)} bytes')
print(f'Compressed Data (Level 9): {len(compressed_data_level_9)} bytes')

# Optionally, print the compressed data as a hexadecimal string for comparison
for level, compressed_data in zip([0, 1, 9], [compressed_data_level_0, compressed_data_level_1, compressed_data_level_9]):
    print(f'Compressed Data (Level {level}):', compressed_data.hex())

Example 4: Using File Compression

This example demonstrates how to compress a file using the lzma module.

import lzma
import os

# Original file path
original_file_path = 'example.txt'

# Destination file path for the compressed data
compressed_file_path = original_file_path + '.xz'

# Check if the original file exists
if not os.path.exists(original_file_path):
    print('Original file does not exist.')
else:
    # Open the original file in binary read mode
    with open(original_file_path, 'rb') as f_in:
        # Compress the file and write to the compressed file
        with lzma.open(compressed_file_path, 'wb') as f_out:
            f_out.write(f_in.read())

    print('File compressed successfully:', compressed_file_path)

Example 5: Using File Decompression

This example demonstrates how to decompress a file that was previously compressed using the lzma module.

import lzma
import os

# Compressed file path
compressed_file_path = 'example.txt.xz'

# Destination file path for the decompressed data
decompressed_file_path = compressed_file_path.replace('.xz', '')

# Check if the compressed file exists
if not os.path.exists(compressed_file_path):
    print('Compressed file does not exist.')
else:
    # Open the compressed file in binary read mode
    with lzma.open(compressed_file_path, 'rb') as f_in:
        # Decompress the file and write to the decompressed file
        with open(decompressed_file_path, 'wb') as f_out:
            f_out.write(f_in.read())

    print('File decompressed successfully:', decompressed_file_path)

Example 6: Using File Compression in a Context Manager

This example demonstrates how to compress and decompress files using the lzma module with a context manager.

import lzma
import os

def compress_file(input_file, output_file):
    """Compress a file using LZMA."""
    with open(input_file, 'rb') as f_in:
        with lzma.open(output_file, 'wb') as f_out:
            f_out.write(f_in.read())

def decompress_file(input_file, output_file):
    """Decompress a file using LZMA."""
    with lzma.open(input_file, 'rb') as f_in:
        with open(output_file, 'wb') as f_out:
            f_out.write(f_in.read())

# Original file path
original_file_path = 'example.txt'

# Destination files for compressed and decompressed data
compressed_file_path = original_file_path + '.xz'
decompressed_file_path = compressed_file_path.replace('.xz', '')

# Compress the file
compress_file(original_file_path, compressed_file_path)
print('File compressed successfully:', compressed_file_path)

# Decompress the file
decompress_file(compressed_file_path, decompressed_file_path)
print('File decompressed successfully:', decompressed_file_path)

These examples cover various aspects of using the lzma module, including compression and decompression of strings, files, and specifying different compression levels. They are designed to be clear, concise, and suitable for inclusion in official documentation to help users understand how to leverage the LZMA compression algorithm in their Python projects.

tarfile - Read and write tar archive files.md

tarfile - Read and write tar archive files

The tarfile module in Python is used to read and write tar archives, which are a common format for archiving multiple files into a single file container. Below are comprehensive examples demonstrating various functionalities of this module:

1. Creating a Tar Archive

import tarfile

# Create a new tar archive
with tarfile.open('example.tar.gz', 'w:gz') as tar:
    # Add individual files to the archive
    tar.add('file1.txt')
    tar.add('folder')

2. Extracting a Tar Archive

import tarfile

# Open an existing tar archive for reading
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Extract all contents to the current directory
    tar.extractall()

3. Writing to a Tar Archive with Specific Compression

import tarfile

# Create a new tar archive with custom compression settings
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
    # Add files or directories to the archive
    tar.add('file1.txt')

4. Extracting from a Tar Archive with Specific Compression

import tarfile

# Open an existing tar archive for reading and specifying compression
with tarfile.open('example.tar.bz2', 'r:bz2') as tar:
    # Extract all contents to the current directory
    tar.extractall()

5. Adding Files or Directories Recursively

import tarfile

# Create a new tar archive and add directories recursively
with tarfile.open('example.tar.gz', 'w:gz') as tar:
    # Add all files and subdirectories in the current directory to the archive
    tar.add('.', recursive=True)

6. Extracting Files or Directories with Specific Options

import tarfile

# Open an existing tar archive for reading and extract with options
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Extract all contents to a specific directory, ignoring existing files
    tar.extractall(path='extracted_files', members=tar.getmembers(), numeric_owner=True)

7. Checking Tar Archive Integrity

import tarfile

# Open an existing tar archive for reading and check its integrity
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Check if all files in the archive are intact
    print(tar.check())

8. Writing to a Tar Archive with Custom File Mode

import tarfile

# Create a new tar archive and add files with specific permissions
with tarfile.open('example.tar.gz', 'w:gz') as tar:
    # Add file1.txt with read-only mode for all users
    info = tar.gettarinfo(name='file1.txt')
    info.mode = 0o444  # 0o444 is the decimal representation of 444, which is r--r--r--
    tar.add('file1.txt', arcname='file1.txt', tarinfo=info)

9. Extracting Files with Specific Permissions

import tarfile

# Open an existing tar archive for reading and extract files with specific permissions
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Extract file1.txt to a directory, setting its mode to read-only for all users
    info = tar.gettarinfo(name='file1.txt')
    info.mode = 0o444
    tar.extract('file1.txt', path='extracted_files', tarinfo=info)

10. Writing to a Tar Archive with Custom File Date

import tarfile
from datetime import datetime

# Create a new tar archive and add files with a specific modification date
with tarfile.open('example.tar.gz', 'w:gz') as tar:
    # Define the desired modification time
    modification_time = datetime(2023, 10, 5, 14, 30)

    # Add file1.txt with a custom modification time
    info = tar.gettarinfo(name='file1.txt')
    info.mtime = modification_time.timestamp()
    tar.add('file1.txt', arcname='file1.txt', tarinfo=info)

11. Extracting Files with Custom File Date

import tarfile
from datetime import datetime

# Open an existing tar archive for reading and extract files with a specific modification date
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Define the desired modification time
    modification_time = datetime(2023, 10, 5, 14, 30)

    # Extract file1.txt from the archive, setting its modification time to the defined value
    info = tar.gettarinfo(name='file1.txt')
    info.mtime = modification_time.timestamp()
    tar.extract('file1.txt', path='extracted_files', tarinfo=info)

12. Writing to a Tar Archive with Custom Link Type

import tarfile

# Create a new tar archive and add symbolic links
with tarfile.open('example.tar.gz', 'w:gz') as tar:
    # Add a symbolic link named 'link.txt' pointing to 'source_file'
    info = tarfile.TarInfo(name='link.txt')
    info.type = tarfile.SYMTYPE  # Symbolic link type
    info.linkname = 'source_file'  # Path to the target file
    tar.addfile(info, open('source_file', 'rb'))

13. Extracting Files with Custom Link Type

import tarfile

# Open an existing tar archive for reading and extract symbolic links
with tarfile.open('example.tar.gz', 'r:gz') as tar:
    # Extract a symbolic link from the archive
    tar.extract('link.txt', path='extracted_files')

These examples cover various aspects of using the tarfile module, including creating, extracting, writing to and reading from tar archives with different compression types, handling file permissions, modification times, and symbolic links.

zipfile - Work with ZIP archives.md

zipfile - Work with ZIP archives

Certainly! Below are comprehensive examples demonstrating various functionalities of the zipfile module in Python, along with explanations for each step:

1. Creating and Writing to a Zip File

import zipfile

def create_zip_file(filename):
    # Create a new zip file in write mode
    with zipfile.ZipFile(filename, 'w') as myzip:
        # Add files to the zip archive
        myzip.write('file1.txt', compress_type=zipfile.ZIP_DEFLATED)
        myzip.write('file2.txt', compress_type=zipfile.ZIP_DEFLATED)

# Usage
create_zip_file('example.zip')

Explanation: - zipfile.ZipFile(filename, 'w'): Opens a new zip file for writing. The 'w' mode creates a new zip file or overwrites an existing one. - myzip.write(file_path, compress_type=zipfile.ZIP_DEFLATED): Adds the specified file to the zip archive. You can choose different compression methods like ZIP_STORED, ZIP_DEFLATED, etc.

2. Reading from a Zip File

import zipfile

def read_from_zip_file(filename):
    # Open an existing zip file in read mode
    with zipfile.ZipFile(filename, 'r') as myzip:
        # Extract all files to the current directory
        myzip.extractall()

# Usage
read_from_zip_file('example.zip')

Explanation: - zipfile.ZipFile(filename, 'r'): Opens an existing zip file for reading. - myzip.extractall(): Extracts all contents of the zip archive to the directory where the script is run.

3. Adding Files Directly from a Directory

import zipfile

def add_files_from_directory(source_dir, destination_zip):
    # Open an existing zip file in append mode
    with zipfile.ZipFile(destination_zip, 'a') as myzip:
        # Walk through the source directory and add all files
        for root, dirs, files in os.walk(source_dir):
            for file in files:
                file_path = os.path.join(root, file)
                myzip.write(file_path, os.path.relpath(file_path, source_dir))

# Usage
add_files_from_directory('source_directory', 'example.zip')

Explanation: - zipfile.ZipFile(destination_zip, 'a'): Opens an existing zip file for appending new files. - os.walk(source_dir): Walks through the specified directory and its subdirectories, yielding directories (root) and filenames (files). - myzip.write(file_path, os.path.relpath(file_path, source_dir)): Adds each file to the zip archive using a relative path to ensure correct extraction.

4. Extracting Specific Files

import zipfile

def extract_specific_files(zip_filename, files_to_extract):
    # Open an existing zip file in read mode
    with zipfile.ZipFile(zip_filename, 'r') as myzip:
        # Extract specific files from the zip archive
        for file in files_to_extract:
            myzip.extract(file)

# Usage
extract_specific_files('example.zip', ['file1.txt'])

Explanation: - myzip.extract(file): Extracts a single file from the zip archive. You can specify which file to extract using its path within the zip.

5. Listing All Files in a Zip File

import zipfile

def list_files_in_zip(zip_filename):
    # Open an existing zip file in read mode
    with zipfile.ZipFile(zip_filename, 'r') as myzip:
        # List all files in the zip archive
        for member in myzip.infolist():
            print(member.filename)

# Usage
list_files_in_zip('example.zip')

Explanation: - myzip.infolist(): Returns a list of ZipInfo objects representing each file in the zip archive. - member.filename: Accesses the filename (including path) for each file.

6. Checking if a File Exists in a Zip

import zipfile

def check_file_in_zip(zip_filename, file_name):
    # Open an existing zip file in read mode
    with zipfile.ZipFile(zip_filename, 'r') as myzip:
        # Check if the file exists in the zip archive
        return file_name in {member.filename for member in myzip.infolist()}

# Usage
print(check_file_in_zip('example.zip', 'file1.txt'))

Explanation: - {member.filename for member in myzip.infolist()}: Creates a set of filenames from the ZipInfo objects, allowing for efficient membership testing.

7. Handling Zip Files with Passwords

import zipfile

def open_password_protected_zip(zip_filename, password):
    # Open an existing zip file that requires a password in read mode
    try:
        with zipfile.ZipFile(zip_filename, 'r', allowZipFilePassword) as myzip:
            # Extract all files from the zip archive using the provided password
            myzip.extractall()
    except RuntimeError as e:
        print(f"Failed to open zip file: {e}")

# Usage
open_password_protected_zip('protected_example.zip', 'yourpassword')

Explanation: - zipfile.ZipFile(zip_filename, 'r', allowZipFilePassword): Opens a zip file that requires a password. You need to import allowZipFilePassword from py7zr for this to work. - myzip.extractall(): Extracts all files from the zip archive using the provided password.

These examples cover a range of functionalities available in the zipfile module, demonstrating how to create, read, and manipulate zip files in Python.

zlib - Compression compatible with gzip.md

zlib - Compression compatible with gzip

Certainly! Below are comprehensive code examples for each functionality available in the zlib module, along with explanations of each step. These examples are designed to be clear, concise, and suitable for inclusion in official documentation.

1. Compressing Data

import zlib

def compress_data(data):
    """
    Compresses input data using the zlib algorithm.

    Parameters:
    - data: bytes, the data to be compressed.

    Returns:
    - bytes, the compressed data.
    """
    # Create a compressor object with default settings (level 6)
    comp = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION)

    # Compress the input data
    compressed_data = comp.compress(data)
    compressed_data += comp.flush()

    return compressed_data

# Example usage
data = b'This is some example data to be compressed using zlib.'
compressed_data = compress_data(data)

print("Compressed Data:", compressed_data)

2. Decompressing Compressed Data

def decompress_data(compressed_data):
    """
    Decompresses previously compressed data using the zlib algorithm.

    Parameters:
    - compressed_data: bytes, the data to be decompressed.

    Returns:
    - bytes, the decompressed original data.
    """
    # Create a decompressor object with default settings
    decomp = zlib.decompressobj()

    # Decompress the input data
    decompressed_data = decomp.decompress(compressed_data)

    return decompressed_data

# Example usage
compressed_data = b'\x78\x9c\x00\x01\x00\x00\x2d\x46\xc4\xa0\x5f\x03'
decompressed_data = decompress_data(compressed_data)

print("Decompressed Data:", decompressed_data.decode('utf-8'))

3. Getting Compression and Decompression Statistics

def get_compression_stats(data):
    """
    Gets statistics on the compression process.

    Parameters:
    - data: bytes, the input data to be compressed.

    Returns:
    - dict, a dictionary containing compression statistics.
    """
    comp = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION)

    # Compress the input data
    comp.compress(data)
    comp.flush()

    # Get statistics
    stats = comp._get_stats()

    return stats

# Example usage
data = b'This is some example data to be compressed using zlib.'
stats = get_compression_stats(data)

print("Compression Statistics:", stats)

4. Handling Compressed Files with zlib.decompressobj

def decompress_file(file_path):
    """
    Decompresses a file that was compressed using the gzip format.

    Parameters:
    - file_path: str, the path to the compressed file.

    Returns:
    - bytes, the decompressed data.
    """
    with open(file_path, 'rb') as f:
        compressed_data = f.read()

    # Create a decompressor object for gzip
    decomp = zlib.decompressobj(zlib.MAX_WBITS | 16)

    # Decompress the file data
    decompressed_data = decomp.decompress(compressed_data)
    decompressed_data += decomp.flush()

    return decompressed_data

# Example usage
file_path = 'example.gz'
decompressed_data = decompress_file(file_path)

print("Decompressed File Data:", decompressed_data.decode('utf-8'))

5. Using zlib.compressobj with Different Compression Levels

def compress_with_level(data, level):
    """
    Compresses input data using the zlib algorithm with a specified compression level.

    Parameters:
    - data: bytes, the data to be compressed.
    - level: int, the compression level (0-9), where 9 is maximum compression.

    Returns:
    - bytes, the compressed data.
    """
    # Create a compressor object with a specific compression level
    comp = zlib.compressobj(level)

    # Compress the input data
    compressed_data = comp.compress(data)
    compressed_data += comp.flush()

    return compressed_data

# Example usage
data = b'This is some example data to be compressed using zlib.'
compressed_data = compress_with_level(data, 9)

print("Compressed Data (Level 9):", compressed_data)

These examples cover the basic functionalities of the zlib module, including compression and decompression, as well as handling file operations with gzip format. Each example includes comments explaining the purpose and functionality of each part of the code.

Data Persistence

copyreg - Register pickle support functions.md

copyreg - Register pickle support functions

The copyreg module in Python's standard library is used to register custom pickling support, allowing you to define how objects of specific types are serialized and deserialized using the pickle module. This can be particularly useful when working with complex data structures or custom classes.

Below are comprehensive code examples for each functionality provided by the copyreg module:

1. Registering Custom Pickling Functionality

Example: Registering a Callable Object

import copyreg
import types

# Define a callable object that you want to pickle
def custom_callable():
    return "Hello, World!"

# Register the callable object with the `copyreg` module
copyreg.pickle(types.FunctionType, lambda f: (custom_callable,))

# Example usage
original = custom_callable()
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: Hello, World!

Explanation: - The types.FunctionType is used to indicate that we are registering a callable object. - The second argument is a function that returns the arguments needed by the pickling process. In this case, it simply returns the custom_callable object itself.

2. Registering Custom Object Types

Example: Registering a Class

import copyreg
import types

# Define a custom class
class MyClass:
    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return f"MyClass(value={self.value})"

# Register the class with the `copyreg` module
copyreg.pickle(MyClass, lambda obj: (obj.value,))

# Example usage
original = MyClass(42)
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: MyClass(value=42)

Explanation: - The MyClass is registered with the copyreg module using a lambda function that returns a tuple containing the object's state, which in this case is just the value attribute.

3. Registering a Class With Multiple Initialization Arguments

Example: Handling Multiple Initialization Parameters

import copyreg
import types

# Define a custom class with multiple initialization parameters
class MyClass:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def __repr__(self):
        return f"MyClass(value1={self.value1}, value2={self.value2})"

# Register the class with the `copyreg` module
copyreg.pickle(MyClass, lambda obj: (obj.value1, obj.value2))

# Example usage
original = MyClass(42, "Hello")
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: MyClass(value1=42, value2='Hello')

Explanation: - The copyreg module supports registering classes with multiple initialization parameters. The lambda function returns a tuple containing all the necessary arguments to reconstruct the object.

4. Registering Custom Objects with Additional Context

Example: Handling Additional Data

import copyreg
import types

# Define a custom class with additional context
class MyClass:
    def __init__(self, value, metadata):
        self.value = value
        self.metadata = metadata

    def __repr__(self):
        return f"MyClass(value={self.value}, metadata={self.metadata})"

# Register the class with the `copyreg` module
def register_my_class(obj):
    return (obj.value, obj.metadata)

copyreg.pickle(MyClass, register_my_class)

# Example usage
original = MyClass(42, {"info": "some data"})
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: MyClass(value=42, metadata={'info': 'some data'})

Explanation: - The register_my_class function is defined to handle the serialization of MyClass objects. It returns a tuple containing both the value and metadata attributes.

5. Registering Custom Objects with Multiple Initialization Methods

Example: Handling Different Constructors

import copyreg
import types

# Define a custom class with multiple constructors
class MyClass:
    def __init__(self, value):
        self.value = value

    @classmethod
    def from_string(cls, string_value):
        return cls(int(string_value))

    def __repr__(self):
        return f"MyClass(value={self.value})"

# Register the class with the `copyreg` module
def register_my_class(obj):
    if isinstance(obj, MyClass):
        return (obj.value,)
    elif hasattr(obj, 'value') and hasattr(obj, 'from_string'):
        return obj.from_string

copyreg.pickle(MyClass, register_my_class)

# Example usage
original = MyClass(42)
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: MyClass(value=42)

original = MyClass.from_string("42")
serialized = pickle.dumps(original)
deserialized = pickle.loads(serialized)

print(deserialized)  # Output: MyClass(value=42)

Explanation: - The register_my_class function checks the type of the object and returns a tuple with the value attribute if it's an instance of MyClass. If it's an instance of a class with a from_string method, it returns the from_string method itself.

Conclusion

The copyreg module provides powerful tools for customizing the pickling process in Python. By registering your own functions and classes with copyreg.pickle, you can extend the serialization capabilities to handle complex objects or specific data structures efficiently.

dbm - Interfaces to Unix databases.md

dbm - Interfaces to Unix โ€œdatabasesโ€

The dbm module in Python provides a simple interface to Unix databases (like DBM, NDBM, GDBM, and BSD DB). While these are low-level interfaces, they offer a basic way to manage key-value pairs. Below are comprehensive examples demonstrating various functionalities of the dbm module:

1. Basic Usage with 'gdbm'

The first example demonstrates how to use the gdbm module for storing and retrieving data.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

# Store key-value pairs
db['key1'] = 'value1'
db['key2'] = 'value2'

# Retrieve values by keys
print(db['key1'])  # Output: value1

# Iterate over all keys in the database
for key in db.keys():
    print(key, db[key])

# Close the database connection
db.close()

2. Usage with 'ndbm' (Non-Distributed DBM)

This example shows how to use ndbm for managing a database that is not distributed across multiple machines.

import ndbm

# Open a database file in write mode
db = ndbm.open('example.ndb', 'c')

# Store key-value pairs
db['key1'] = 'value1'
db['key2'] = 'value2'

# Retrieve values by keys
print(db['key1'])  # Output: value1

# Iterate over all keys in the database
for key in db.keys():
    print(key, db[key])

# Close the database connection
db.close()

3. Usage with 'gdbm' for String Values

This example demonstrates how to use gdbm with string values.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

# Store string values using Unicode
db['key1'] = b'value1'
db['key2'] = b'value2'

# Retrieve and decode the value by keys
print(db['key1'].decode('utf-8'))  # Output: value1

# Iterate over all keys in the database and decode values
for key in db.keys():
    print(key, db[key].decode('utf-8'))

# Close the database connection
db.close()

4. Usage with 'gdbm' for Binary Data

This example shows how to use gdbm with binary data.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

# Store binary data using bytes
data1 = b'\x00\x01\x02'
data2 = b'\x03\x04\x05'

db['key1'] = data1
db['key2'] = data2

# Retrieve and print the binary data by keys
print(db['key1'])  # Output: b'\x00\x01\x02'
print(db['key2'])  # Output: b'\x03\x04\x05'

# Close the database connection
db.close()

5. Usage with 'gdbm' for Multiple Keys

This example demonstrates how to store and retrieve multiple key-value pairs.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

# Store multiple key-value pairs
db['key1'] = 'value1'
db['key2'] = 'value2'
db['key3'] = 'value3'

# Retrieve values by keys
print(db['key1'])  # Output: value1
print(db['key2'])  # Output: value2
print(db['key3'])  # Output: value3

# Iterate over all keys in the database
for key in db.keys():
    print(key, db[key])

# Close the database connection
db.close()

6. Usage with 'gdbm' for Conditional Storage

This example demonstrates how to conditionally store data based on certain conditions.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

# Conditionally store data
key_to_check = 'specific_key'
value = 'if_true_value' if key_to_check == 'specific_key' else 'if_false_value'

db[key_to_check] = value

# Retrieve and print the stored value
print(db[key_to_check])  # Output: if_true_value

# Close the database connection
db.close()

7. Usage with 'gdbm' for Error Handling

This example demonstrates how to handle errors when opening a database file.

import gdbm

try:
    # Attempt to open a non-existent database file
    db = gdbm.open('nonexistent.db', 'c')
except gdbm.error as e:
    print(f"Error opening the database: {e}")

# Close the database connection if it was successfully opened
if hasattr(db, 'close'):
    db.close()

8. Usage with 'gdbm' for Database Closure

This example demonstrates how to ensure proper closure of the database.

import gdbm

try:
    # Open a database file in write mode
    db = gdbm.open('example.db', 'c')

    # Store data in the database
    db['key'] = 'value'

except gdbm.error as e:
    print(f"Error opening or writing to the database: {e}")
else:
    # Ensure the database is closed
    if hasattr(db, 'close'):
        db.close()

9. Usage with 'gdbm' for Database Transaction Management

This example demonstrates how to manage transactions in gdbm.

import gdbm

# Open a database file in write mode
db = gdbm.open('example.db', 'c')

try:
    # Begin a transaction
    db.sync()

    # Store data in the database
    db['key'] = 'value'

    # Commit the transaction
    db.sync()
except gdbm.error as e:
    print(f"Error during database operation: {e}")
else:
    # Ensure the database is closed
    if hasattr(db, 'close'):
        db.close()

10. Usage with 'gdbm' for Database Cleanup

This example demonstrates how to clean up after using gdbm.

import gdbm

try:
    # Open a database file in write mode
    db = gdbm.open('example.db', 'c')

    # Store data in the database
    db['key'] = 'value'

except gdbm.error as e:
    print(f"Error opening or writing to the database: {e}")
else:
    # Ensure the database is closed and removed
    if hasattr(db, 'close'):
        db.close()
    import os
    os.remove('example.db')

These examples cover various aspects of using the dbm module, from basic operations to error handling and transaction management. For more detailed information, refer to the official Python documentation on dbm.

marshal - Internal Python object serialization.md

marshal - Internal Python object serialization

The marshal module is an internal component of Python's standard library designed to serialize (convert objects into a byte stream) and deserialize (convert byte streams back into Python objects). This is useful for saving memory when dealing with complex data structures or when transferring objects over network protocols.

marshal.dump(obj, file)

Description: Serialize an object obj into a file-like object file.

import marshal

# Example usage of marshal.dump()
data = {
    'name': 'Alice',
    'age': 30,
    'is_student': False,
    'courses': ['Math', 'Science']
}

# Open a file in binary write mode
with open('data.bin', 'wb') as f:
    # Serialize the data and write to the file
    marshal.dump(data, f)

marshal.loads(byte_stream)

Description: Deserialize a byte stream byte_stream back into a Python object.

import marshal

# Example usage of marshal.loads()
with open('data.bin', 'rb') as f:
    # Read the binary data from the file
    byte_stream = f.read()

# Deserialize the byte stream to an object
loaded_data = marshal.loads(byte_stream)

print(loaded_data)

marshal.dumps(obj, proto=0, write_bytearray=False)

Description: Serialize an object obj into a byte stream using protocol proto. The default protocol is 0, which can be updated with newer versions as needed.

import marshal

# Example usage of marshal.dumps()
data = {
    'name': 'Bob',
    'age': 25,
    'is_student': True,
    'courses': ['History', 'Art']
}

# Serialize the data using protocol 0 and convert to a bytearray if write_bytearray is True
serialized_data = marshal.dumps(data, proto=0, write_bytearray=True)

print(serialized_data)

Example of Using marshal for Network Serialization

In practice, marshal can be used to serialize objects for transmission over networks. This is useful when you need to serialize data in a format that can be easily parsed by other applications or systems.

import socket
import marshal

# Function to serialize an object and send it over a network
def send_object_over_network(obj):
    with open('data.bin', 'wb') as f:
        # Serialize the object
        serialized_data = marshal.dumps(obj)
        f.write(serialized_data)

    # Create a socket and connect to a server
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(('localhost', 12345))

        # Send the length of the serialized data first
        length = len(serialized_data).to_bytes(4, byteorder='big')
        s.sendall(length)

        # Send the serialized data
        s.sendall(serialized_data)

# Example usage of send_object_over_network()
send_object_over_network({
    'name': 'Charlie',
    'age': 35,
    'is_student': False,
    'courses': ['English', 'Music']
})

Example of Receiving and Deserializing an Object from a Network

import socket
import marshal

# Function to receive data over a network, deserialize it, and return the object
def receive_object_from_network():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # Bind the socket and listen for connections
        s.bind(('localhost', 12345))
        s.listen()

        # Accept a connection from a client
        conn, addr = s.accept()

        # Receive the length of the serialized data
        length_bytes = conn.recv(4)
        length = int.from_bytes(length_bytes, byteorder='big')

        # Receive the serialized data
        serialized_data = bytearray()
        while len(serialized_data) < length:
            chunk = conn.recv(min(length - len(serialized_data), 1024))
            if not chunk:
                break
            serialized_data.extend(chunk)

        # Deserialize the received byte stream
        loaded_data = marshal.loads(serialized_data)

        return loaded_data

# Example usage of receive_object_from_network()
received_data = receive_object_from_network()
print(received_data)

Conclusion

The marshal module provides a simple yet efficient way to serialize and deserialize Python objects. It is particularly useful for scenarios where you need to transfer or store complex data structures in a format that can be easily parsed by other applications. By following the examples provided, you can integrate marshal into your projects to handle object serialization more effectively.

pickle - Python object serialization.md

pickle - Python object serialization

The pickle module in Python is used for serializing and deserializing (or pickling and unpickling) objects. This is useful for saving and restoring complex data structures, such as nested dictionaries or lists, to disk or between sessions. Below are comprehensive examples of how to use the pickle module for serialization and deserialization.

1. Serializing Objects

Example: Serializing a List

import pickle

# Define a list with some data
data = [1, 2, 3, 'hello', {'key': 'value'}, ['nested', 'list']]

# Open a file in binary write mode to store the serialized object
with open('data.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the list and save it to the file
    pickle.dump(data, file)

print("Data has been successfully pickled and saved.")

Example: Serializing a Custom Class

import pickle

# Define a simple class
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"

# Create an instance of the class
person = Person('Alice', 30)

# Open a file in binary write mode to store the serialized object
with open('person.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the class and save it to the file
    pickle.dump(person, file)

print("Person object has been successfully pickled and saved.")

2. Deserializing Objects

Example: Deserializing a List

import pickle

# Open a file in binary read mode to load the serialized object
with open('data.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the object from the file
    loaded_data = pickle.load(file)

print("Data has been successfully unpickled:", loaded_data)

Example: Deserializing a Custom Class

import pickle

# Open a file in binary read mode to load the serialized object
with open('person.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the class from the file
    loaded_person = pickle.load(file)

print("Person object has been successfully unpickled:", loaded_person)

3. Handling Special Characters

Example: Serializing a String with Special Characters

import pickle

# Define a string containing special characters
special_string = "Hello, World! ๐Ÿ˜Š"

# Open a file in binary write mode to store the serialized object
with open('special_string.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the string and save it to the file
    pickle.dump(special_string, file)

print("Special character string has been successfully pickled and saved.")

Example: Deserializing a String with Special Characters

import pickle

# Open a file in binary read mode to load the serialized object
with open('special_string.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the string from the file
    loaded_special_string = pickle.load(file)

print("Special character string has been successfully unpickled:", loaded_special_string)

4. Handling Lists with Numpy Arrays

Example: Serializing a List with Numpy Arrays

import pickle
import numpy as np

# Create a list containing a numpy array
data_with_array = [1, 2, 3, 'hello', {'key': 'value'}, ['nested', 'list'], np.array([4.5, 6.7])]

# Open a file in binary write mode to store the serialized object
with open('data_with_array.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the list and save it to the file
    pickle.dump(data_with_array, file)

print("Data with numpy array has been successfully pickled and saved.")

Example: Deserializing a List with Numpy Arrays

import pickle
import numpy as np

# Open a file in binary read mode to load the serialized object
with open('data_with_array.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the list and retrieve the numpy array
    loaded_data = pickle.load(file)
    numpy_array = loaded_data[-1]  # Assuming numpy array is at the last index

print("Data with numpy array has been successfully unpickled:", numpy_array)

5. Handling Cyclic Structures

Example: Serializing a Cyclic Structure (e.g., nested list)

import pickle

# Create a cyclic structure using lists
cycle_list = [1, 2, 3]
cycle_list.append(cycle_list)

# Open a file in binary write mode to store the serialized object
with open('cyclic_structure.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the cyclic list and save it to the file
    pickle.dump(cycle_list, file)

print("Cyclic structure has been successfully pickled and saved.")

Example: Deserializing a Cyclic Structure (e.g., nested list)

import pickle

# Open a file in binary read mode to load the serialized object
with open('cyclic_structure.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the cyclic list and retrieve it
    loaded_cycle_list = pickle.load(file)

print("Cyclic structure has been successfully unpickled:", loaded_cycle_list)

6. Handling Large Objects

Example: Serializing a Large List

import pickle
import random

# Generate a large list with random integers
large_list = [random.randint(0, 1000) for _ in range(100000)]

# Open a file in binary write mode to store the serialized object
with open('large_list.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the large list and save it to the file
    pickle.dump(large_list, file)

print("Large list has been successfully pickled and saved.")

Example: Deserializing a Large List

import pickle

# Open a file in binary read mode to load the serialized object
with open('large_list.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the large list from the file
    loaded_large_list = pickle.load(file)

print("Large list has been successfully unpickled:", len(loaded_large_list))

7. Handling Binary Files

Example: Serializing a List with Binary Data

import pickle
import base64

# Define a list containing binary data
binary_data = [b'\x01\x02\x03', b'hello', b'\xff']

# Open a file in binary write mode to store the serialized object
with open('binary_data.pickle', 'wb') as file:
    # Use pickle.dump() to serialize the list and save it to the file
    pickle.dump(binary_data, file)

print("Binary data has been successfully pickled and saved.")

Example: Deserializing a List with Binary Data

import pickle
import base64

# Open a file in binary read mode to load the serialized object
with open('binary_data.pickle', 'rb') as file:
    # Use pickle.load() to deserialize the list and retrieve the binary data
    loaded_binary_data = pickle.load(file)

print("Binary data has been successfully unpickled:", loaded_binary_data)

8. Handling Custom Pickle Modules

Example: Using dill for Serialization

import dill
import numpy as np

# Define a custom class using `dill`
class CustomClass:
    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return f"CustomClass(value={self.value})"

# Create an instance of the custom class
custom_obj = CustomClass(42)

# Open a file in binary write mode to store the serialized object using dill
with open('custom_class_dill.pickle', 'wb') as file:
    # Use dill.dump() to serialize the custom class and save it to the file
    dill.dump(custom_obj, file)

print("Custom class has been successfully pickled and saved using dill.")

Example: Deserializing a Custom Class Using dill

import dill

# Open a file in binary read mode to load the serialized object using dill
with open('custom_class_dill.pickle', 'rb') as file:
    # Use dill.load() to deserialize the custom class from the file
    loaded_custom_obj = dill.load(file)

print("Custom class has been successfully unpickled using dill:", loaded_custom_obj)

Conclusion

The pickle module is a powerful tool for serializing and deserializing Python objects, which can be used in various scenarios such as saving data structures across sessions or transmitting them over networks. This module supports a wide range of object types and can handle complex cyclic structures, large data sets, and even custom classes with custom pickling methods. By using dill, you can extend the capabilities of pickle to support more complex data structures that may not be supported by default. Always ensure proper error handling when working with serialization to manage unexpected situations gracefully.

shelve - Python object persistence.md

shelve - Python object persistence

The shelve module in Python provides a dictionary-like interface to persistent data storage, allowing you to store complex objects without worrying about serialization and deserialization.

Below are comprehensive and well-documented code examples for various functionalities provided by the shelve module:

1. Basic Usage

import shelve

# Create or open a shelf file in write mode (or 'r' for read-only)
with shelve.open('example.db') as db:
    # Store data in the shelf
    db['key'] = {'name': 'Alice', 'age': 30}

    # Access stored data
    print(db['key'])  # Output: {'name': 'Alice', 'age': 30}

# The file is automatically closed when exiting the with block

2. Handling Different Data Types

import shelve

with shelve.open('example.db') as db:
    # Store a set, tuple, and list
    db['set'] = {1, 2, 3}
    db['tuple'] = (4, 5)
    db['list'] = [6, 7, 8]

    # Access stored data
    print(db['set'])   # Output: {1, 2, 3}
    print(db['tuple'])  # Output: (4, 5)
    print(db['list'])  # Output: [6, 7, 8]

# Note: Sets are not persistent in shelve by default, use pickle or custom serialization if needed

3. Using a Custom Serialization Format

import shelve
import json

with shelve.open('example.db', protocol=2) as db:
    # Store a dictionary using JSON for serialization
    db['person'] = {'name': 'Bob', 'age': 40}

    # Load and access the stored data
    loaded_person = json.loads(db['person'])
    print(loaded_person)  # Output: {'name': 'Bob', 'age': 40}

# The file is automatically closed when exiting the with block

4. Deleting Items from a Shelf

import shelve

with shelve.open('example.db') as db:
    # Store some data
    db['item1'] = {'a': 1, 'b': 2}
    db['item2'] = {'c': 3, 'd': 4}

    # Delete an item
    del db['item1']

    # Access the remaining items
    print(db.items())  # Output: [('item2', {'c': 3, 'd': 4})]

# The file is automatically closed when exiting the with block

5. Iterating Over a Shelf

import shelve

with shelve.open('example.db') as db:
    # Store some data
    db['item1'] = {'a': 1, 'b': 2}
    db['item2'] = {'c': 3, 'd': 4}

    # Iterate over the shelf items
    for key, value in db.items():
        print(f"Key: {key}, Value: {value}")

# The file is automatically closed when exiting the with block

6. Closing a Shelf Explicitly

import shelve

db = shelve.open('example.db')
try:
    # Store data
    db['info'] = {'username': 'admin', 'password': 'secret'}
finally:
    # Close the shelf explicitly
    db.close()

# The file is closed manually in this example

7. Using a Shelve File as a Dictionary

import shelve

with shelve.open('example.db') as db:
    # Store data using dictionary-like syntax
    db['new_key'] = 'new_value'

    # Access stored data using dictionary-like access
    print(db['new_key'])  # Output: new_value

# The file is automatically closed when exiting the with block

8. Handling Exceptions During Shelf Operations

import shelve

try:
    with shelve.open('example.db') as db:
        # Attempt to store a complex object that cannot be serialized by default
        db['complex'] = {**db, 'additional': {'new_key': 'new_value'}}
except TypeError as e:
    print(f"An error occurred: {e}")

# The file is automatically closed when exiting the with block

9. Using a Shelve File in a Multithreaded Environment

import shelve
from threading import Thread

def write_to_shelf(shelf):
    with shelf:
        shelf['data'] = {'thread_id': threading.current_thread().ident}

# Create and start multiple threads to write to the same shelf
threads = [Thread(target=write_to_shelf, args=(shelve.open('example.db'),)) for _ in range(5)]
for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

10. Using a Shelve File with Multiple Databases

import shelve

# Open multiple shelves from the same file, each with different protocols
with shelve.open('example.db', protocol=2) as db1, shelve.open('example.db', protocol=4) as db2:
    db1['proto_2'] = {'key': 'value'}
    db2['proto_4'] = {'key': 'value'}

# Access data from each shelf
print(db1['proto_2'])  # Output: {'key': 'value'}
print(db2['proto_4'])  # Output: {'key': 'value'}

These examples cover various scenarios and functionalities of the shelve module, demonstrating how to use it for persistent data storage in Python.

sqlite3 - DB-API 2.0 interface for SQLite databases.md

sqlite3 - DB-API 2.0 interface for SQLite databases

Here are comprehensive code examples for using the sqlite3 module in Python, which provides an interface to the SQLite database engine: 1. Connecting to a SQLite database:

import sqlite3

# Connect to the SQLite database (or create it if it doesn't exist)
conn = sqlite3.connect('my_database.db')
  1. Creating a cursor object to execute SQL commands:
cursor = conn.cursor()
  1. Executing an SQL command to create a table:
cursor.execute('''CREATE TABLE IF NOT EXISTS users
             (id INTEGER PRIMARY KEY, name TEXT NOT NULL)''')
  1. Inserting data into the table using parameterized queries:
cursor.execute("INSERT INTO users (name) VALUES (?)", ('John',))
conn.commit()
  1. Executing a SQL query to retrieve data from the table:
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Closing the database connection and cursor:
cursor.close()
conn.close()
  1. Handling exceptions using try-except blocks:
import sqlite3

try:
    conn = sqlite3.connect('my_database.db')
    cursor = conn.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS users
             (id INTEGER PRIMARY KEY, name TEXT NOT NULL)''')
    cursor.execute("INSERT INTO users (name) VALUES (?)", ('John',))
    conn.commit()
    cursor.execute("SELECT * FROM users")
    rows = cursor.fetchall()
    for row in rows:
        print(row)
finally:
    cursor.close()
    conn.close()
  1. Creating a connection using a context manager:
import sqlite3

with sqlite3.connect('my_database.db') as conn:
    cursor = conn.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS users
             (id INTEGER PRIMARY KEY, name TEXT NOT NULL)''')
    cursor.execute("INSERT INTO users (name) VALUES (?)", ('John',))
    cursor.execute("SELECT * FROM users")
    rows = cursor.fetchall()
    for row in rows:
        print(row)
  1. Executing an SQL command using a parameterized query with named placeholders:
cursor.execute("INSERT INTO users (name) VALUES (:name)", {'name': 'John'})
conn.commit()
  1. Executing an SQL command to update data in the table:
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ('Jane', 1))
conn.commit()
  1. Executing an SQL command to delete data from the table:
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()
  1. Executing an SQL command using a parameterized query with positional placeholders:
cursor.execute("INSERT INTO users (name) VALUES (?, ?)", ('John', 'Doe'))
conn.commit()
  1. Executing an SQL command to select distinct values from a table:
cursor.execute("SELECT DISTINCT name FROM users")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to count the number of rows in a table:
cursor.execute("SELECT COUNT(*) FROM users")
row = cursor.fetchone()
print(row[0])
  1. Executing an SQL command to order the results by a column:
cursor.execute("SELECT * FROM users ORDER BY name DESC")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to join two tables:
cursor.execute("SELECT u.name, t.value FROM users u JOIN table2 t ON u.id = t.user_id")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to perform a group by operation:
cursor.execute("SELECT name, COUNT(*) FROM users GROUP BY name")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to calculate the average of a column:
cursor.execute("SELECT AVG(age) FROM users")
row = cursor.fetchone()
print(row[0])
  1. Executing an SQL command to calculate the sum of a column:
cursor.execute("SELECT SUM(salary) FROM employees")
row = cursor.fetchone()
print(row[0])
  1. Executing an SQL command to calculate the maximum value of a column:
cursor.execute("SELECT MAX(height) FROM people")
row = cursor.fetchone()
print(row[0])
  1. Executing an SQL command to calculate the minimum value of a column:
cursor.execute("SELECT MIN(weight) FROM people")
row = cursor.fetchone()
print(row[0])
  1. Executing an SQL command to select data from multiple tables using subqueries:
cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > 30) AS u JOIN table2 t ON u.id = t.user_id")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to select data from multiple tables using joins and conditions:
cursor.execute("SELECT u.name, t.value FROM users u JOIN table2 t ON u.id = t.user_id WHERE u.age > 30")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to select data from multiple tables using subqueries and conditions:
cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > 30) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > 100")
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters:
cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > :value", {'age': 30, 'value': 100})
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters and placeholders:
cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > ?", (100,))
rows = cursor.fetchall()
for row in rows:
    print(row)
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters and placeholders, and handling exceptions:
import sqlite3

try:
    conn = sqlite3.connect('my_database.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > ?", (100,))
    rows = cursor.fetchall()
    for row in rows:
        print(row)
except sqlite3.Error as e:
    print("An error occurred:", e)
finally:
    cursor.close()
    conn.close()
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters, placeholders, and handling exceptions and logging:
import sqlite3
import logging

logging.basicConfig(level=logging.INFO)

try:
    conn = sqlite3.connect('my_database.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > ?", (100,))
    rows = cursor.fetchall()
    for row in rows:
        logging.info(row)
except sqlite3.Error as e:
    logging.error("An error occurred:", e)
finally:
    cursor.close()
    conn.close()
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters, placeholders, and handling exceptions and logging, and using context managers:
import sqlite3
import logging

logging.basicConfig(level=logging.INFO)

try:
    with sqlite3.connect('my_database.db') as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > ?", (100,))
        rows = cursor.fetchall()
        for row in rows:
            logging.info(row)
except sqlite3.Error as e:
    logging.error("An error occurred:", e)
  1. Executing an SQL command to select data from multiple tables using joins and conditions with parameters, placeholders, and handling exceptions and logging, and using context managers and exception handling:
import sqlite3
import logging

logging.basicConfig(level=logging.INFO)

try:
    with sqlite3.connect('my_database.db') as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM (SELECT id, name FROM users WHERE age > :age) AS u JOIN table2 t ON u.id = t.user_id WHERE t.value > ?", (100,))
        rows = cursor.fetchall()
except sqlite3.Error as e:
    logging.error("An error occurred:", e)
else:
    for row in rows:
        logging.info(row)
finally:
    cursor.close()
    conn.close()

Debugging and Profiling

bdb - Debugger framework.md

bdb - Debugger framework

The bdb module in Python is a debugging framework that allows you to debug programs interactively at the source code level. Below are comprehensive examples of how to use each of the main functions and classes provided by this module. These examples cover basic usage, common debugging scenarios, and best practices for integrating bdb into your applications.

1. Basic Usage

First, ensure you have a script or function that you want to debug. For simplicity, let's create a simple script:

# example_script.py
def add(a, b):
    result = a + b
    return result

result = add(5, 3)
print("Result:", result)

To use bdb for debugging this script, you can start by setting up the debugger and stepping through the code:

import bdb
import sys

# Define a custom exception to handle the breakpoint
class BreakpointException(Exception):
    pass

def break_here():
    raise BreakpointException("Break here!")

if __name__ == "__main__":
    try:
        exec(open('example_script.py').read())
    except BreakpointException as e:
        bdb.set_trace()
        print(e)

2. Customizing the Debugger

You can customize the behavior of bdb by subclassing the Bdb class and overriding methods to add custom functionality:

class MyBdb(bdb.Bdb):
    def post_mortem(self, frame):
        # Override post-mortem to show a custom message
        print("Post-mortem debugging started.")
        bdb.Bdb.post_mortem(self, frame)

def my_main():
    try:
        exec(open('example_script.py').read())
    except Exception as e:
        my_bdb = MyBdb()
        my_bdb.set_trace()
        print(f"Error: {e}")

if __name__ == "__main__":
    my_main()

3. Debugging Interactive Input

bdb can also be used to debug interactive input:

import bdb
import sys

def prompt_for_input(prompt):
    return input(prompt)

def process_input(input_value):
    result = prompt_for_input("Enter a number: ")
    try:
        num = float(result)
        print(f"The processed number is: {num}")
    except ValueError:
        raise ValueError("Invalid input. Please enter a valid number.")

if __name__ == "__main__":
    try:
        process_input(input())
    except bdb.Breakpoint as e:
        print(e)

4. Using bdb.set_trace() in an Interactive Session

You can use bdb.set_trace() directly in an interactive session to start debugging a script:

import bdb

def add(a, b):
    result = a + b
    return result

# Start the debugger at this point
result = add(5, 3)
print("Result:", result)

try:
    exec(open('example_script.py').read())
except Exception as e:
    bdb.set_trace()
    print(f"Error: {e}")

5. Debugging Nested Functions

When dealing with nested functions, you can use bdb to step into them:

import bdb
import sys

def outer_function():
    def inner_function(a):
        return a * 2

    result = inner_function(3)
    print("Result:", result)

# Start the debugger at this point
outer_function()

try:
    exec(open('example_script.py').read())
except Exception as e:
    bdb.set_trace()
    print(f"Error: {e}")

6. Customizing Output

You can customize the output of bdb by overriding methods in your custom subclass:

class MyBdb(bdb.Bdb):
    def do_print(self, arg):
        # Override print to show a custom message
        print("Custom print statement:", arg)

def my_main():
    try:
        exec(open('example_script.py').read())
    except Exception as e:
        my_bdb = MyBdb()
        my_bdb.set_trace()
        print(f"Error: {e}")

if __name__ == "__main__":
    my_main()

7. Debugging with a Custom Breakpoint

You can define a custom breakpoint by subclassing bdb.Breakpoint:

class CustomBreakpoint(bdb.Breakpoint):
    def __init__(self, frame, code):
        super().__init__(frame, code)
        self.message = "Custom breakpoint triggered."

def my_main():
    try:
        exec(open('example_script.py').read())
    except Exception as e:
        custom_bp = CustomBreakpoint(None, None)
        custom_bp.__call__()
        print(f"Error: {e}")

if __name__ == "__main__":
    my_main()

8. Debugging with Logging

You can use bdb to log debugging information:

import bdb
import logging

# Set up basic configuration for logging
logging.basicConfig(level=logging.DEBUG)

def add(a, b):
    result = a + b
    logging.debug(f"Adding {a} and {b}, got {result}")
    return result

if __name__ == "__main__":
    try:
        exec(open('example_script.py').read())
    except Exception as e:
        bdb.set_trace()
        print(f"Error: {e}")

These examples demonstrate various aspects of using the bdb module, from basic debugging to more advanced customization options. By integrating these techniques into your development workflow, you can effectively debug complex programs and scripts in Python.

faulthandler - Dump the Python traceback.md

faulthandler - Dump the Python traceback

The faulthandler module in Python is used to enable a core dump of the Python interpreter on segmentation faults, errors, or other unhandled exceptions. This can be particularly useful for debugging and recovering from crashes. Below are some comprehensive code examples that demonstrate various functionalities of the faulthandler module.

1. Basic Usage

import faulthandler

# Enable core dump generation
faulthandler.enable()

try:
    # Code that might cause a crash
    import sys
    sys.exit(0)
except Exception as e:
    print("An error occurred:", e)

2. Customizing Core Dump Generation

import faulthandler

# Enable core dump generation with custom options
faulthandler.enable(file="core", all_threads=True, chain=False)

try:
    # Code that might cause a crash
    import sys
    sys.exit(0)
except Exception as e:
    print("An error occurred:", e)

3. Disabling Core Dump Generation

import faulthandler

# Disable core dump generation
faulthandler.disable()

try:
    # Code that might cause a crash
    import sys
    sys.exit(0)
except Exception as e:
    print("An error occurred:", e)

4. Listing Enabled Core Dump Filenames

import faulthandler

# List all core dump filenames enabled by the program
print(faulthandler.get_enabled())

5. Setting Custom Dump Directory

import faulthandler

# Set a custom directory for saving core dumps
faulthandler.set_dump_dir("/path/to/directory")

try:
    # Code that might cause a crash
    import sys
    sys.exit(0)
except Exception as e:
    print("An error occurred:", e)

6. Listing All Supported Formats

import faulthandler

# List all supported formats for dumping the traceback
print(faulthandler.get_dump_formats())

7. Setting Custom Format

import faulthandler

# Set a custom format for dumping the traceback
faulthandler.set_dump_format("c")

try:
    # Code that might cause a crash
    import sys
    sys.exit(0)
except Exception as e:
    print("An error occurred:", e)

8. Listing All Threads

import faulthandler

# List all threads in the current process
print(faulthandler.get_all_threads())

9. Dumping Traceback for a Specific Thread

import faulthandler

# Get a specific thread object
thread = faulthandler.get_thread(123)

if thread:
    # Dump the traceback for the specified thread
    print("Dumping traceback for thread", thread.ident)
    faulthandler.dump_traceback(thread)
else:
    print("Thread not found")

10. Printing a Stack Trace

import faulthandler

# Print the current stack trace
faulthandler.print_stack()

These examples cover various aspects of using the faulthandler module, from enabling and disabling core dump generation to customizing options and handling exceptions. Each example includes comments explaining key steps and uses standard library functions and modules effectively.

pdb - The Python Debugger.md

pdb - The Python Debugger

Below is a comprehensive set of code examples for the pdb module, which provides an interactive command-line interface to interact with running Python programs. Each example includes comments explaining each step.

# Importing the pdb module
import pdb

def simple_function(a, b):
    # Entering the debugger at this point
    pdb.set_trace()

    result = a + b
    return result

# Example usage of simple_function
try:
    print(simple_function(2, 3))
except Exception as e:
    print(f"An error occurred: {e}")

Explanation:

  1. Importing the pdb Module: python import pdb This line imports the pdb module, which is used for debugging purposes.

  2. Defining a Function with Debugging Point: ```python def simple_function(a, b): # Entering the debugger at this point pdb.set_trace()

    result = a + b return result `` -pdb.set_trace()` is called to set a breakpoint in the function. This means execution will pause whenever the function is called.

  3. Example Usage of the Function: python try: print(simple_function(2, 3)) except Exception as e: print(f"An error occurred: {e}")

  4. The function simple_function is called with arguments 2 and 3.
  5. Since there's a breakpoint in the function, execution will pause at that point.

Debugging Commands:

When you run the script and hit the breakpoint, you can use various commands to interactively debug the code. Here are some common debugging commands:

Full Example with Debugging:

Here's an example that includes these debugging commands:

# Importing the pdb module
import pdb

def divide(a, b):
    # Entering the debugger at this point
    pdb.set_trace()

    result = a / b
    return result

# Example usage of divide function with some test cases
try:
    print(divide(10, 2))  # Expected output: 5.0
    print(divide(10, 0))  # Expected to trigger an exception
except Exception as e:
    print(f"An error occurred: {e}")

Explanation:

By following these examples and using the provided debugging commands, you can effectively use the pdb module to debug Python programs.

timeit - Measure execution time of small code snippets.md

timeit - Measure execution time of small code snippets

The timeit module in Python is a simple timing interface that helps measure short durations by running a given statement multiple times. It's particularly useful for benchmarking and profiling Python code. Below are comprehensive and well-documented examples demonstrating various functionalities of the timeit module.

1. Basic Usage

import timeit

# Measure execution time of a simple addition
result = timeit.timeit("a + b", globals=globals(), number=1000)
print(f"Execution time: {result:.6f} seconds")

Explanation:

2. Measuring Multiple Statements

import timeit

# Measure execution time of multiple statements
result = timeit.timeit("""
a = [1, 2, 3]
b = [4, 5, 6]
result = list(map(lambda x, y: x + y, a, b))
""", globals=globals(), number=1000)
print(f"Execution time: {result:.6f} seconds")

Explanation:

3. Measuring Time for a Function

import timeit

def my_function():
    return [i * i for i in range(1000)]

# Measure execution time of a defined function
result = timeit.timeit("my_function()", globals=globals(), number=1000)
print(f"Execution time: {result:.6f} seconds")

Explanation:

4. Using Timeit.Timer for Detailed Control

import timeit

# Create a Timer object for more detailed control
timer = timeit.Timer("a + b", globals=globals())

# Measure execution time in seconds
result_seconds = timer.timeit(number=1000)
print(f"Execution time (seconds): {result_seconds:.6f}")

# Measure execution time in number of loops
result_loops = timer.repeat(3, 1000)  # Repeat the measurement 3 times with 1000 iterations each
print("Execution times per repetition:", result_loops)

Explanation:

5. Measuring Time for Multiple Statements with Timer

import timeit

timer = timeit.Timer("""
a = [1, 2, 3]
b = [4, 5, 6]
result = list(map(lambda x, y: x + y, a, b))
""", globals=globals())

# Measure execution time in seconds for multiple statements
result_seconds = timer.timeit(number=1000)
print(f"Execution time (seconds): {result_seconds:.6f}")

# Measure execution time in number of loops
result_loops = timer.repeat(3, 1000)  # Repeat the measurement 3 times with 1000 iterations each
print("Execution times per repetition:", result_loops)

Explanation:

6. Timing Code with Setup

import timeit

# Measure execution time with setup code
result = timeit.timeit("result = sum(a)", globals=globals(), number=1000, setup="a = [i for i in range(1000)]")
print(f"Execution time: {result:.6f} seconds")

Explanation:

7. Measuring Execution Time with Additional Options

import timeit

# Measure execution time with additional options
result = timeit.timeit("result = sum(a)", globals=globals(), number=1000, repeat=3, setup="a = [i for i in range(1000)]")
print(f"Execution times (seconds): {result:.6f}")

Explanation:

Conclusion

The timeit module is a powerful tool for measuring the execution time of small code snippets in Python. It provides flexibility through the use of parameters like number, setup, and repeat, allowing you to control the timing behavior according to your needs. These examples cover basic usage, multiple statements, function execution, detailed control with timeit.Timer, and more, demonstrating its versatility for performance analysis and benchmarking.

Further Reading

This code is designed to be clear, concise, and suitable for inclusion in official documentation examples.

trace - Trace or track Python statement execution.md

trace - Trace or track Python statement execution

The trace module is a part of the Python Standard Library that provides a way to trace the execution of Python programs. It allows you to instrument your program to log each statement as it executes, which can be useful for debugging and profiling.

Below are comprehensive code examples demonstrating various functionalities provided by the trace module:

Example 1: Basic Tracing with trace.tracemalloc

import trace
import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

try:
    # Your code to be traced goes here
    for i in range(100000):
        x = [i] * 1000000
except KeyboardInterrupt:
    pass

# Print the top 10 memory allocation entries
print(tracemalloc.get_top(10))

# Stop tracing memory allocations and print statistics
tracemalloc.stop()

Explanation: - trace.tracemalloc.start() starts monitoring memory allocations. - The code block to be traced is wrapped in a try-except block to allow graceful termination with a keyboard interrupt (Ctrl+C). - tracemalloc.get_top(10) retrieves the top 10 memory allocation entries, which can help identify memory leaks or inefficient usage. - tracemalloc.stop() stops monitoring and prints statistics.

Example 2: Tracing Execution with trace.Trace

import trace

# Define a function to be traced
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

# Create a Trace object
tracer = trace.Trace(
    countcalls=True, # Count calls made by functions
    trace=2,         # Trace function calls with level 2 (deep)
    countlines=True   # Count lines of code executed
)

# Run the function under tracing
tracer.run('factorial(10)')

# Report the results
tracer.results().write_results(show_missing=True, coverdir=".")

Explanation: - trace.Trace is used to create a tracer object with options to count function calls, trace function calls deeply, and count lines of code executed. - The run method executes the specified Python expression (e.g., factorial(10)) under tracing. - tracer.results().write_results(show_missing=True, coverdir=".") writes the results to a file in a directory named ., showing missing calls and providing a coverage report.

Example 3: Tracing with Custom Filters

import trace

# Define a custom filter function
def filter_frame(frame):
    # Exclude frames from specific modules or functions
    if frame.f_code.co_filename.startswith('/usr/lib/python3'):
        return False
    if 'trace.py' in frame.f_code.co_name:
        return False
    return True

# Create a Trace object with a custom filter
tracer = trace.Trace(
    countcalls=True,
    trace=2,
    countlines=True,
    ignore_function=filter_frame
)

# Run the function under tracing
tracer.run('factorial(10)')

# Report the results
tracer.results().write_results(show_missing=True, coverdir=".")

Explanation: - A custom filter function filter_frame is defined to exclude frames from specific modules or functions. - The ignore_function option in trace.Trace uses this filter to skip certain frames during tracing. - The results are written to a file with missing calls and coverage report.

Example 4: Tracing with Custom Output

import trace

# Define custom output functions
def write_start(message):
    print(f"Starting {message}")

def write_end(message):
    print(f"Ending {message}")

# Create a Trace object with custom output
tracer = trace.Trace(
    countcalls=True,
    trace=2,
    countlines=True,
    start_func=write_start,
    finish_func=write_end
)

# Run the function under tracing
tracer.run('factorial(10)')

# Report the results
tracer.results().write_results(show_missing=True, coverdir=".")

Explanation: - Custom start and end functions write_start and write_end are defined to log messages at the beginning and end of each traced function. - The start_func and finish_func options in trace.Trace use these functions to log trace events. - The results are written to a file with missing calls and coverage report.

These examples demonstrate various ways to use the trace module for tracing Python execution, including memory allocation monitoring, detailed execution traces, custom filtering, and custom output.

tracemalloc - Trace memory allocations.md

tracemalloc - Trace memory allocations

The tracemalloc module is a built-in tool that provides support for tracing memory allocation events. It can help identify memory leaks and optimize memory usage by analyzing how memory is allocated and deallocated over time.

Here are some code examples demonstrating the usage of the tracemalloc module:

1. Enabling Tracing

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

2. Capturing Memory Snapshot

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations
# For example, create a large list of dictionaries
large_list = [{} for _ in range(1000)]

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

3. Analyzing Memory Snapshot

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations
# For example, create a large list of dictionaries
large_list = [{} for _ in range(1000)]

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

# Print the top 5 most common allocations
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:5]:
    print(stat)

4. Analyzing Top Memory Usage

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations
# For example, create a large list of dictionaries
large_list = [{} for _ in range(1000)]

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

# Print the top 5 most common allocations by size
top_stats = snapshot.statistics('size')
for stat in top_stats[:5]:
    print(stat)

5. Analyzing Memory Usage Over Time

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations over time
large_list = []
for _ in range(10):
    large_list.append([{} for _ in range(1000)])

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

# Print the top 5 most common allocations by size at each step
top_stats = snapshot.statistics('size')
for stat in top_stats:
    print(stat)

6. Writing Results to File

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations
large_list = [{} for _ in range(1000)]

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

# Write the top 5 most common allocations to a file
with open('memory_stats.txt', 'w') as f:
    stats = snapshot.statistics('lineno')
    for stat in stats[:5]:
        f.write(f"{stat.lineno}:{stat.count} bytes\n")

7. Resetting Tracing

import tracemalloc

# Start tracing memory allocations
tracemalloc.start()

# Perform some memory-intensive operations
large_list = [{} for _ in range(1000)]

# Stop tracing and capture a snapshot
snapshot = tracemalloc.take_snapshot()

# Reset tracing to start fresh
tracemalloc.reset_peak()

8. Using with Context Manager

import tracemalloc

with tracemalloc.start():
    # Perform some memory-intensive operations
    large_list = [{} for _ in range(1000)]

# Stop tracing after the context manager exits
snapshot = tracemalloc.take_snapshot()

# Print the top 5 most common allocations by size
top_stats = snapshot.statistics('size')
for stat in top_stats[:5]:
    print(stat)

These examples demonstrate various functionalities of the tracemalloc module, including starting and stopping tracing, capturing snapshots, analyzing memory usage, writing results to a file, resetting tracing, and using the module with a context manager. Each example includes comments for clarity.

Development Tools

2to3 - Automated Python 2 to 3 code translation.md

2to3 - Automated Python 2 to 3 code translation

The 2to3 module is used for automatically converting Python 2 code to Python 3 code. It provides tools and utilities to help developers transition their codebases from Python 2 to Python 3, ensuring compatibility and reducing the need for manual modifications. Below are comprehensive examples demonstrating various functionalities of the 2to3 module.

Example 1: Basic Conversion with a Script

Description:

This example demonstrates how to use the 2to3 tool as a script in your application to convert Python 2 code to Python 3.

import sys
from lib2to3.main import main

# Define the directory containing the Python 2 files to be converted
input_dir = 'path/to/your/python2/code'

# Define the directory where the converted Python 3 files will be saved
output_dir = 'path/to/your/python3/code'

# Run the conversion process
main("lib2to3.fixes", [input_dir, output_dir])

Explanation:

Example 2: Using Fixers Manually

Description:

This example shows how to manually use the fixer classes provided by the lib2to3 module to convert specific parts of your code.

import lib2to3
from lib2to3 import fix_all, pytree, refactor

# Define the file path containing Python 2 code
file_path = 'path/to/your/python2/file.py'

# Create a parser object for the input file
with open(file_path, 'rb') as f:
    tree = pytree.parse(f.read())

# Define the fixers to apply
fixers_to_apply = [lib2to3.fixes.fix_print, lib2to3.fixes.fix_raw_input]

# Create a refactoring context
context = refactor.RefactorContext()

# Apply the fixers to the input tree
refactor.apply_fixes(tree, fixers_to_apply, context)

# Output the modified code to a new file
with open('path/to/your/python3/file.py', 'w') as f:
    f.write(str(tree))

Explanation:

Example 3: Running 2to3 on Multiple Files

Description:

This example demonstrates how to run 2to3 on multiple files at once using the fix_all function.

import lib2to3

# Define a list of file paths containing Python 2 code
file_paths = ['path/to/your/python2/file1.py', 'path/to/your/python2/file2.py']

# Run the conversion process on all specified files
fix_all(file_paths, fixers_to_apply=["lib2to3.fixes.fix_print"])

Explanation:

Example 4: Using 2to3 as a Command-line Tool

Description:

This example shows how to use the 2to3 tool as a command-line utility, which is often more convenient for large codebases.

# Run the conversion process from the command line
python -m lib2to3.fixes.fix_print path/to/your/python2/code path/to/your/python3/code

Explanation:

These examples cover various aspects of using the 2to3 module, from basic script usage to manual application of fixers and running conversions on multiple files.

doctest - Test interactive Python examples.md

doctest - Test interactive Python examples

The doctest module in Python is a testing framework that provides tools to run and verify tests written as docstrings in Python modules, classes, functions, and methods. It is particularly useful for verifying that the examples provided in docstrings are correct and up-to-date.

Below are comprehensive code examples demonstrating various functionalities of the doctest module:

Example 1: Basic Usage

import doctest
import unittest

def add(a, b):
    """
    >>> add(1, 2)
    3
    >>> add(5, 7)
    12
    """
    return a + b

# Run the doctests in the module
doctest.testmod()

Example 2: Testing Functions with More Complex Arguments

def multiply(a, b):
    """
    >>> multiply(3, 4)
    12
    >>> multiply(-2, 5)
    -10
    """
    return a * b

# Run the doctests in the module
doctest.testmod()

Example 3: Testing Functions with Lists and Tuples

def sort_and_filter(numbers):
    """
    Sorts a list of numbers in ascending order and filters out even numbers.

    >>> sort_and_filter([5, 3, 8, 1, 4])
    [1, 3, 5]
    """
    return sorted(filter(lambda x: x % 2 != 0, numbers))

# Run the doctests in the module
doctest.testmod()

Example 4: Testing Functions with String Manipulation

def reverse_string(s):
    """
    Reverses a given string.

    >>> reverse_string('hello')
    'olleh'
    >>> reverse_string('Python')
    'nohtyP'
    """
    return s[::-1]

# Run the doctests in the module
doctest.testmod()

Example 5: Testing Functions with Conditional Logic

def is_positive(n):
    """
    Determines if a number is positive.

    >>> is_positive(10)
    True
    >>> is_positive(-3)
    False
    """
    return n > 0

# Run the doctests in the module
doctest.testmod()

Example 6: Testing Functions with Class Methods

class Calculator:
    def add(self, a, b):
        return a + b

    def multiply(self, a, b):
        return a * b

# Define the class and its method docstrings
doc = """
Calculator class provides basic arithmetic operations.

>>> calc = Calculator()
>>> calc.add(3, 4)
7
>>> calc.multiply(5, 6)
30
"""

# Run the doctests in the module
doctest.testmod()

# Optionally, you can run the doctests using unittest framework
class TestCalculator(unittest.TestCase):
    def test_add(self):
        self.assertEqual(Calculator().add(3, 4), 7)

    def test_multiply(self):
        self.assertEqual(Calculator().multiply(5, 6), 30)

# Run the tests
unittest.main(argv=[''], exit=False)

Example 7: Testing Functions with External Modules

def parse_json(json_str):
    """
    Parses a JSON string and returns a Python dictionary.

    >>> data = parse_json('{"name": "John", "age": 30}')
    {'name': 'John', 'age': 30}
    """
    import json
    return json.loads(json_str)

# Run the doctests in the module
doctest.testmod()

Example 8: Testing Functions with Assertions

def check_even(num):
    """
    Asserts that a number is even.

    >>> check_even(4)
    True
    >>> check_even(7)
    Traceback (most recent call last):
        ...
    AssertionError: 7 is not even
    """
    assert num % 2 == 0, f"{num} is not even"

# Run the doctests in the module
doctest.testmod()

These examples cover various scenarios and functionalities of the doctest module. Each example includes a docstring with test cases that are verified by running the testmod() function or using an external testing framework like unittest. This approach ensures that the documentation is self-contained and easily verifiable.

pydoc - Documentation generator and online help system.md

pydoc - Documentation generator and online help system

The pydoc module in Python is a tool that can generate HTML documentation from Python modules, classes, functions, methods, exceptions, keywords, and built-in types. It provides an interactive way to access this documentation and can also be used programmatically.

Below are several examples demonstrating various functionalities of the pydoc module:

Example 1: Generating Documentation for a Specific Module

import pydoc

# Generate HTML documentation for the math module
help("math")

This will open a web browser displaying the documentation for the Python math module. You can access this documentation by navigating to http://localhost:8000.

Example 2: Using Interactive Help

import pydoc

# Use interactive help system
pydoc.help()

This will start an interactive help session where you can type Python expressions and receive explanations for them, including their docstrings.

Example 3: Generating HTML Documentation to a File

import pydoc

# Generate HTML documentation for the os module to a file
pydoc.writedoc("os", "os.html")

This will create an os.html file in the current directory containing HTML documentation for the os module.

Example 4: Generating HTML Documentation for Multiple Modules

import pydoc

# Generate HTML documentation for multiple modules to separate files
pydoc.writedoc("math", "math.html")
pydoc.writedoc("os", "os.html")

This will create two html files, math.html and os.html, containing HTML documentation for the math and os modules, respectively.

Example 5: Generating HTML Documentation with a Custom Template

import pydoc

# Generate HTML documentation with a custom template
pydoc.writedoc("os", "custom_template.html", template="path/to/custom/template.py")

This will generate HTML documentation for the os module using a custom template located at path/to/custom/template.py.

Example 6: Generating Text Documentation

import pydoc

# Generate text documentation for the math module
pydoc.pager("math")

This will display the documentation for the math module in a pager window, allowing you to scroll through it.

Example 7: Using pydoc with a Script

import pydoc

def my_function():
    """
    This is a simple function that does something.

    Parameters:
    x (int): The input value.

    Returns:
    int: The result of the operation.
    """
    pass

# Generate HTML documentation for the current script
pydoc.writedoc(my_function, "my_script.html")

This will generate HTML documentation for the my_function defined in the script, placing it in a file named my_script.html.

Example 8: Generating Command-Line Help

import pydoc

# Generate command-line help for a specific module
pydoc.web("math", "http://localhost:8000")

This will start an interactive web server that provides command-line help for the math module, accessible via http://localhost:8000.

These examples cover various aspects of using the pydoc module to generate and display documentation in different formats. You can customize these examples by modifying paths, parameters, and templates according to your needs.

test - Regression tests package for Python.md

test - Regression tests package for Python

The test module in Python is a comprehensive testing framework that provides tools for writing unit, integration, and system tests. It includes various classes and functions to help you organize your tests and run them efficiently. Below are some examples of how to use the test module to write and run tests.

Example 1: Writing a Simple Unit Test

import unittest

class TestExample(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(2 + 2, 4)

    def test_subtraction(self):
        self.assertEqual(5 - 3, 2)

if __name__ == '__main__':
    unittest.main()

Explanation: - Import unittest: This module provides a framework for writing tests. - Create a Test Class: Inherit from unittest.TestCase. - Write Test Methods: Each test method must start with test_ to be recognized by the unittest framework. - Use Assertions: Use assertions like assertEqual, assertTrue, assertFalse to check the expected outcomes of your tests. - Run Tests: The unittest.main() function will discover and run all test methods in the current module.

Example 2: Writing a Test for a Custom Function

Suppose you have a simple function that calculates the factorial of a number:

def factorial(n):
    if n < 0:
        raise ValueError("Factorial is not defined for negative numbers")
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

import unittest

class TestFactorial(unittest.TestCase):
    def test_factorial_5(self):
        self.assertEqual(factorial(5), 120)

    def test_factorial_0(self):
        self.assertEqual(factorial(0), 1)

    def test_factorial_negative_error(self):
        with self.assertRaises(ValueError):
            factorial(-3)

if __name__ == '__main__':
    unittest.main()

Explanation: - Custom Function: A simple function to calculate the factorial of a number. - Assertions: Use assertEqual for numerical comparisons and assertRaises to test exceptions. - Test Cases: Ensure that the function behaves as expected under different conditions, including edge cases.

Example 3: Writing Integration Tests

Integration tests typically test how different components work together. For example, if you have a web application with separate modules for routing and user authentication:

import unittest
from myapp.routing import Router
from myapp.auth import Auth

class TestApp(unittest.TestCase):
    def setUp(self):
        self.router = Router()
        self.auth = Auth()

    def test_route_and_authenticate(self):
        # Simulate a request to a route that requires authentication
        response = self.router.handle_request('/protected')
        self.assertTrue(response.startswith('401 Unauthorized'))

        # Authenticate the user and try again
        self.auth.login('user', 'password')
        response = self.router.handle_request('/protected')
        self.assertIn('Hello, user!', response)

if __name__ == '__main__':
    unittest.main()

Explanation: - Setup: Initialize objects for routing and authentication in setUp. - Test Methods: Simulate HTTP requests to different parts of your application and verify the responses. - Assertions: Use assertions to check the expected behavior after performing actions.

Example 4: Writing System Tests

System tests often test the entire system, including integration with external services or databases. For example, testing a web application that interacts with a database:

import unittest
from myapp.app import create_app
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

engine = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
session = Session()

class TestSystemApp(unittest.TestCase):
    def setUp(self):
        Base.metadata.create_all(engine)

    def test_add_user(self):
        new_user = User(name='John Doe')
        session.add(new_user)
        session.commit()
        self.assertEqual(session.query(User).count(), 1)

if __name__ == '__main__':
    unittest.main()

Explanation: - SQLAlchemy Setup: Use SQLAlchemy to create a simple database and test it. - Test Methods: Add data to the database and verify that it is correctly stored. - Assertions: Use assertions to check the expected state of the database.

Example 5: Writing a Test Using unittest.mock

unittest.mock can be used to mock objects or functions during testing:

import unittest
from myapp.service import UserService

class TestUserService(unittest.TestCase):
    def test_get_user(self, mock_get_request):
        # Mock the get_request method of UserService
        mock_get_request.return_value = {'name': 'John Doe'}
        user_service = UserService()
        user = user_service.get_user('user')
        self.assertEqual(user['name'], 'John Doe')

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

Explanation: - Mocking: Use unittest.mock.patch to mock the get_request method of the UserService. - Test Method: Call the get_user method and verify that it returns the expected result. - Running Tests: The test can be run directly using unittest.main(argv=[''], exit=False).

These examples demonstrate basic usage of the test module in Python, including writing unit tests, integration tests, system tests, and using mocking to test complex systems. You can expand these examples by adding more test cases and scenarios as needed for your specific application or library.

test.support - Utilities for the Python test suite.md

test.support - Utilities for the Python test suite

The test.support module is part of Python's standard library, designed to support testing by providing utility functions that are commonly needed across different tests. Below are comprehensive examples demonstrating various functionalities provided by this module.

1. Running Tests with a Specific Python Version

import test.support

def run_tests_with_python_version(version):
    """
    Run the test suite using a specific Python version.

    Parameters:
        version (str): The Python version to use, e.g., '3.8', '3.9'.
    """
    # Check if the specified version is valid
    assert test.support.python_version_tuple >= tuple(map(int, version.split('.')))

    # Set the PATH environment variable to point to the desired Python binary
    os.environ['PATH'] = '/path/to/python' + version

    # Run the tests
    test_support.run_unittest('test_module_to_run')

# Example usage
run_tests_with_python_version('3.9')

2. Generating Test Data for Specific Cases

import test.support

def generate_test_data(num_elements):
    """
    Generate a list of random integers.

    Parameters:
        num_elements (int): The number of elements in the list to generate.

    Returns:
        list: A list of random integers.
    """
    # Import the necessary module
    import random

    # Generate and return the list of random integers
    return [random.randint(0, 100) for _ in range(num_elements)]

# Example usage
data = generate_test_data(20)
print(data)

3. Running Tests with Different Execution Modes

import test.support

def run_tests_with_mode(mode):
    """
    Run the test suite using a specific execution mode.

    Parameters:
        mode (str): The execution mode to use, e.g., 'fast', 'slow'.
    """
    # Set the TEST_MODE environment variable to control the execution mode
    os.environ['TEST_MODE'] = mode

    # Run the tests
    test_support.run_unittest('test_module_to_run')

# Example usage
run_tests_with_mode('slow')

4. Running Tests with Custom Test Runner

import test.support

def run_tests_with_custom_runner():
    """
    Run the test suite using a custom test runner.

    The custom runner can be implemented using the `test_support.TestProgram` class.
    """
    # Define the test program
    test_program = test_support.TestProgram(
        argv=['-m', 'unittest'],
        exit=False,
        module='test_module_to_run'
    )

    # Run the tests
    test_program.run()

# Example usage
run_tests_with_custom_runner()

5. Running Tests with Specific Test Output Formats

import test.support

def run_tests_with_output_format(format):
    """
    Run the test suite and capture its output in a specific format.

    Parameters:
        format (str): The output format, e.g., 'text', 'junitxml'.
    """
    # Set the TEST_OUTPUT_FORMAT environment variable to control the output format
    os.environ['TEST_OUTPUT_FORMAT'] = format

    # Run the tests
    test_support.run_unittest('test_module_to_run')

# Example usage
run_tests_with_output_format('junitxml')

6. Running Tests with Specific Test Suite Configuration

import test.support

def run_tests_with_config(config):
    """
    Run the test suite using a specific configuration.

    Parameters:
        config (dict): The configuration settings to apply, e.g., {'verbose': True}.
    """
    # Set the TEST_CONFIG environment variable to control the configuration
    os.environ['TEST_CONFIG'] = json.dumps(config)

    # Run the tests
    test_support.run_unittest('test_module_to_run')

# Example usage
config = {'verbose': True}
run_tests_with_config(config)

These examples demonstrate how to use various functionalities provided by test.support to customize and control the execution of Python unit tests. Each example includes comments explaining the purpose, parameters, and usage of the functions.

test.support.script_helper - Utilities for the Python test suite.md

test.support.script_helper - Utilities for the Python test suite

The test.support.script_helper module is part of Python's standard library, designed to provide utility functions that are useful for testing purposes within the Python framework. This module is particularly useful for scripts and modules that need to run tests without relying on the full environment of a running interpreter.

Below are some comprehensive examples demonstrating various functionalities provided by the test.support.script_helper module:

Example 1: Using script_runner

import test.support.script_helper

# Define a script that will be executed by script_runner
script = """
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
"""

# Run the script using script_runner
result = test.support.script_helper.run_script(script)

# Print the output of the script
print(result.stdout)

Example 2: Using run_command

import test.support.script_helper

# Define a command that will be executed by run_command
command = ["ls", "-l"]

# Run the command using run_command
result = test.support.script_helper.run_command(command)

# Print the output of the command
print(result.stdout)

Example 3: Using check_call

import test.support.script_helper

# Define a list of commands that will be executed by check_call
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Check the exit status and output of the commands using check_call
test.support.script_helper.check_call(commands)

Example 4: Using check_output

import test.support.script_helper

# Define a list of commands that will be executed by check_output
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Capture the output and exit status of the commands using check_output
output, _ = test.support.script_helper.check_output(commands)

# Print the captured output
print(output.decode('utf-8'))

Example 5: Using run_python

import test.support.script_helper

# Define a script that will be executed by run_python
script = """
def add(a, b):
    return a + b

result = add(3, 4)
print(result)
"""

# Run the Python script using run_python
result = test.support.script_helper.run_python(script)

# Print the output of the Python script
print(result.stdout)

Example 6: Using check_call_and_capture_output

import test.support.script_helper

# Define a list of commands that will be executed by check_call_and_capture_output
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Capture both the output and exit status of the commands using check_call_and_capture_output
output, _ = test.support.script_helper.check_call_and_capture_output(commands)

# Print the captured output
print(output.decode('utf-8'))

Example 7: Using check_output_and_capture_output

import test.support.script_helper

# Define a list of commands that will be executed by check_output_and_capture_output
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Capture both the output and exit status of the commands using check_output_and_capture_output
output, _ = test.support.script_helper.check_output_and_capture_output(commands)

# Print the captured output
print(output.decode('utf-8'))

Example 8: Using run_python_file

import test.support.script_helper

# Define a script that will be executed by run_python_file
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Run the Python file using run_python_file
result = test.support.script_helper.run_python_file(script_path)

# Print the output of the Python script
print(result.stdout)

Example 9: Using run_subprocess

import subprocess
import test.support.script_helper

# Define a list of commands that will be executed by run_subprocess
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Run the commands using run_subprocess
result = test.support.script_helper.run_subprocess(commands)

# Print the output of the commands
print(result.stdout)

Example 10: Using check_call_and_capture_output_with_env

import os
import test.support.script_helper

# Define a list of commands that will be executed by check_call_and_capture_output_with_env
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Capture both the output and exit status of the commands using check_call_and_capture_output_with_env
output, _ = test.support.script_helper.check_call_and_capture_output_with_env(commands, env)

# Print the captured output
print(output.decode('utf-8'))

Example 11: Using check_output_and_capture_output_with_env

import os
import test.support.script_helper

# Define a list of commands that will be executed by check_output_and_capture_output_with_env
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Capture both the output and exit status of the commands using check_output_and_capture_output_with_env
output, _ = test.support.script_helper.check_output_and_capture_output_with_env(commands, env)

# Print the captured output
print(output.decode('utf-8'))

Example 12: Using run_python_file_and_capture_output

import os
import test.support.script_helper

# Define a script that will be executed by run_python_file_and_capture_output
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the Python file using run_python_file_and_capture_output
result = test.support.script_helper.run_python_file_and_capture_output(script_path, env)

# Print the captured output
print(result.stdout)

Example 13: Using run_subprocess_with_env

import os
import subprocess
import test.support.script_helper

# Define a list of commands that will be executed by run_subprocess_with_env
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the commands using run_subprocess_with_env
result = test.support.script_helper.run_subprocess_with_env(commands, env)

# Print the output of the commands
print(result.stdout)

Example 14: Using check_call_and_capture_output_with_cwd

import os
import test.support.script_helper

# Define a list of commands that will be executed by check_call_and_capture_output_with_cwd
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set the working directory for the subprocess
cwd = "/path/to/directory"

# Capture both the output and exit status of the commands using check_call_and_capture_output_with_cwd
output, _ = test.support.script_helper.check_call_and_capture_output_with_cwd(commands, cwd)

# Print the captured output
print(output.decode('utf-8'))

Example 15: Using check_output_and_capture_output_with_cwd

import os
import test.support.script_helper

# Define a list of commands that will be executed by check_output_and_capture_output_with_cwd
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set the working directory for the subprocess
cwd = "/path/to/directory"

# Capture both the output and exit status of the commands using check_output_and_capture_output_with_cwd
output, _ = test.support.script_helper.check_output_and_capture_output_with_cwd(commands, cwd)

# Print the captured output
print(output.decode('utf-8'))

Example 16: Using run_python_file_and_capture_output_with_cwd

import os
import test.support.script_helper

# Define a script that will be executed by run_python_file_and_capture_output_with_cwd
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Set the working directory for the subprocess
cwd = "/path/to/directory"

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the Python file using run_python_file_and_capture_output_with_cwd
result = test.support.script_helper.run_python_file_and_capture_output_with_cwd(script_path, env, cwd)

# Print the captured output
print(result.stdout)

Example 17: Using run_subprocess_with_cwd

import os
import subprocess
import test.support.script_helper

# Define a list of commands that will be executed by run_subprocess_with_cwd
commands = [
    ["echo", "Hello, World!"],
    ["sleep", "2"]
]

# Set the working directory for the subprocess
cwd = "/path/to/directory"

# Run the commands using run_subprocess_with_cwd
result = test.support.script_helper.run_subprocess_with_cwd(commands, cwd)

# Print the output of the commands
print(result.stdout)

Example 18: Using check_call_and_capture_output_with_timeout

import os
import time
import test.support.script_helper

# Define a list of commands that will be executed by check_call_and_capture_output_with_timeout
commands = [
    ["sleep", "30"]
]

# Set the timeout for the subprocess
timeout = 20

# Capture both the output and exit status of the commands using check_call_and_capture_output_with_timeout
output, _ = test.support.script_helper.check_call_and_capture_output_with_timeout(commands, timeout)

# Print the captured output
print(output.decode('utf-8'))

Example 19: Using check_output_and_capture_output_with_timeout

import os
import time
import test.support.script_helper

# Define a list of commands that will be executed by check_output_and_capture_output_with_timeout
commands = [
    ["sleep", "30"]
]

# Set the timeout for the subprocess
timeout = 20

# Capture both the output and exit status of the commands using check_output_and_capture_output_with_timeout
output, _ = test.support.script_helper.check_output_and_capture_output_with_timeout(commands, timeout)

# Print the captured output
print(output.decode('utf-8'))

Example 20: Using run_python_file_and_capture_output_with_timeout

import os
import time
import test.support.script_helper

# Define a script that will be executed by run_python_file_and_capture_output_with_timeout
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Set the timeout for the subprocess
timeout = 20

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the Python file using run_python_file_and_capture_output_with_timeout
result = test.support.script_helper.run_python_file_and_capture_output_with_timeout(script_path, env, timeout)

# Print the captured output
print(result.stdout)

Example 21: Using run_subprocess_with_timeout

import os
import time
import subprocess
import test.support.script_helper

# Define a list of commands that will be executed by run_subprocess_with_timeout
commands = [
    ["sleep", "30"]
]

# Set the timeout for the subprocess
timeout = 20

# Run the commands using run_subprocess_with_timeout
result = test.support.script_helper.run_subprocess_with_timeout(commands, timeout)

# Print the output of the commands
print(result.stdout)

Example 22: Using check_call_and_capture_output_with_retry

import os
import time
import retrying
import test.support.script_helper

@retrying.retry(stop_max_attempt_number=3, wait_fixed=1000)
def check_call_and_capture_output_with_retry(commands):
    try:
        output, _ = test.support.script_helper.check_call_and_capture_output(commands)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a list of commands that will be executed by check_call_and_capture_output_with_retry
commands = [
    ["sleep", "30"]
]

# Run the commands using check_call_and_capture_output_with_retry
result = check_call_and_capture_output_with_retry(commands)

# Print the captured output
print(result)

Example 23: Using check_output_and_capture_output_with_retry

import os
import time
import retrying
import test.support.script_helper

@retrying.retry(stop_max_attempt_number=3, wait_fixed=1000)
def check_output_and_capture_output_with_retry(commands):
    try:
        output, _ = test.support.script_helper.check_output_and_capture_output(commands)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a list of commands that will be executed by check_output_and_capture_output_with_retry
commands = [
    ["sleep", "30"]
]

# Run the commands using check_output_and_capture_output_with_retry
result = check_output_and_capture_output_with_retry(commands)

# Print the captured output
print(result)

Example 24: Using run_python_file_and_capture_output_with_retry

import os
import time
import retrying
import test.support.script_helper

@retrying.retry(stop_max_attempt_number=3, wait_fixed=1000)
def run_python_file_and_capture_output_with_retry(script_path, env):
    try:
        output = test.support.script_helper.run_python_file_and_capture_output(script_path, env)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a script that will be executed by run_python_file_and_capture_output_with_retry
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the Python file using run_python_file_and_capture_output_with_retry
result = run_python_file_and_capture_output_with_retry(script_path, env)

# Print the captured output
print(result)

Example 25: Using run_subprocess_with_retry

import os
import time
import retrying
import subprocess
import test.support.script_helper

@retrying.retry(stop_max_attempt_number=3, wait_fixed=1000)
def run_subprocess_with_retry(commands):
    try:
        result = subprocess.run(commands, capture_output=True, text=True, check=True)
        return result.stdout
    except Exception as e:
        raise

# Define a list of commands that will be executed by run_subprocess_with_retry
commands = [
    ["sleep", "30"]
]

# Run the commands using run_subprocess_with_retry
result = run_subprocess_with_retry(commands)

# Print the output of the commands
print(result)

Example 26: Using check_call_and_capture_output_with_custom_logger

import os
import logging
import test.support.script_helper

# Configure custom logger
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def custom_logger(message):
    logging.info(message)

def check_call_and_capture_output_with_custom_logger(commands):
    try:
        output, _ = test.support.script_helper.check_call_and_capture_output(commands, logger=custom_logger)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a list of commands that will be executed by check_call_and_capture_output_with_custom_logger
commands = [
    ["echo", "Hello, World!"]
]

# Run the commands using check_call_and_capture_output_with_custom_logger
result = check_call_and_capture_output_with_custom_logger(commands)

# Print the captured output
print(result)

Example 27: Using check_output_and_capture_output_with_custom_logger

import os
import logging
import test.support.script_helper

# Configure custom logger
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def custom_logger(message):
    logging.info(message)

def check_output_and_capture_output_with_custom_logger(commands):
    try:
        output, _ = test.support.script_helper.check_output_and_capture_output(commands, logger=custom_logger)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a list of commands that will be executed by check_output_and_capture_output_with_custom_logger
commands = [
    ["echo", "Hello, World!"]
]

# Run the commands using check_output_and_capture_output_with_custom_logger
result = check_output_and_capture_output_with_custom_logger(commands)

# Print the captured output
print(result)

Example 28: Using run_python_file_and_capture_output_with_custom_logger

import os
import logging
import test.support.script_helper

# Configure custom logger
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def custom_logger(message):
    logging.info(message)

def run_python_file_and_capture_output_with_custom_logger(script_path, env):
    try:
        output = test.support.script_helper.run_python_file_and_capture_output(script_path, env, logger=custom_logger)
        return output.decode('utf-8')
    except Exception as e:
        raise

# Define a script that will be executed by run_python_file_and_capture_output_with_custom_logger
script_path = "greet.py"
with open(script_path, 'w') as f:
    f.write("""
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
""")

# Set environment variables for the subprocess
env = {
    "MY_VAR": "test"
}

# Run the Python file using run_python_file_and_capture_output_with_custom_logger
result = run_python_file_and_capture_output_with_custom_logger(script_path, env)

# Print the captured output
print(result)

Example 29: Using run_subprocess_with_custom_logger

import os
import logging
import subprocess
import test.support.script_helper

# Configure custom logger
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def custom_logger(message):
    logging.info(message)

def run_subprocess_with_custom_logger(commands):
    try:
        result = subprocess.run(commands, capture_output=True, text=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, logger=custom_logger)
        return result.stdout.decode('utf-8')
    except Exception as e:
        raise

# Define a list of commands that will be executed by run_subprocess_with_custom_logger
commands = [
    ["echo", "Hello, World!"]
]

# Run the commands using run_subprocess_with_custom_logger
result = run_subprocess_with_custom_logger(commands)

# Print the output of the commands
print(result)

Example 30: Using check_call_and_capture_output_with_timeout

import os
import signal
from contextlib import TimeoutExpired

def check_call_and_capture_output_with_timeout(commands, timeout):
    try:
        process = subprocess.Popen(commands, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        stdout, stderr = process.communicate(timeout=timeout)
        return stdout, stderr
    except TimeoutExpired as e:
        print(f"Command timed out: {e}")
        raise

# Define a list of commands that will be executed by check_call_and_capture_output_with_timeout
commands = [
    ["sleep", "30"]
]

# Set the timeout in seconds
timeout = 10

# Run the commands using check_call_and_capture_output_with_timeout
stdout, stderr = check_call_and_capture_output_with_timeout(commands, timeout)

# Print the captured output and errors
print("Standard Output:", stdout)
print("Standard Error:", stderr)

These examples demonstrate various ways to handle command execution in Python, including capturing outputs, handling environment variables, setting timeouts, using custom loggers, and more. You can adapt these scripts to fit your specific use case by modifying the commands, environment variables, or other parameters as needed. Additionally, you may need to install additional packages depending on your requirements, such as subprocess for running shell commands.

typing - Support for type hints.md

typing - Support for type hints

The typing module is a powerful addition to Python that provides a way to add static type checking to your code using type hints, which are annotations that describe the expected types of variables and function arguments. Here are comprehensive and well-documented examples for various functionalities within the typing module:

1. Type Annotations

Type annotations can be added to functions, classes, methods, and variables to help with static type checking.

from typing import *
import datetime

# Function with type hints
def add(a: int, b: int) -> int:
    """Returns the sum of two integers."""
    return a + b

# Class with type annotations
class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def greet(self) -> str:
        """Returns a greeting message."""
        return f"Hello, my name is {self.name} and I am {self.age} years old."

# Method with type hints
def get_current_date() -> datetime.date:
    """Returns the current date."""
    return datetime.date.today()

2. Type Aliases

Type aliases allow you to give a new name to an existing type, making your code more readable and maintainable.

from typing import *
import collections

# Type alias for a list of strings
StringList = List[str]

# Using the type alias in a function
def filter_strings(strings: StringList) -> StringList:
    """Returns a list of strings that start with 'a'."""
    return [s for s in strings if s.startswith('a')]

# Example usage of the type alias
names = ["alice", "bob", "carol"]
filtered_names = filter_strings(names)
print(filtered_names)  # Output: ['alice', 'carol']

3. Optional Values

Use Optional to indicate that a variable can be either a specified type or None.

from typing import *

# Function with optional parameters
def greet(name: str, age: Optional[int] = None) -> str:
    """Returns a greeting message, optionally including the age."""
    if age is not None:
        return f"Hello, my name is {name} and I am {age} years old."
    else:
        return f"Hello, my name is {name}."

4. Generic Types

Generics allow you to create reusable functions or classes that work with different types.

from typing import *
import collections

# Generic function for list operations
def process_list(lst: List[T]) -> List[T]:
    """Applies a processing operation to each element in the list."""
    return [x * 2 for x in lst]

# Example usage of the generic function with integers and strings
numbers = [1, 2, 3]
strings = ["a", "b", "c"]

processed_numbers = process_list(numbers)
processed_strings = process_list(strings)

print(processed_numbers)   # Output: [2, 4, 6]
print(processed_strings)  # Output: ['aa', 'bb', 'cc']

5. Callable Types

Use Callable to indicate that a variable is expected to be a callable object.

from typing import *
import operator

# Function with type hint for a callable
def apply_operation(op: Callable[[int, int], int], a: int, b: int) -> int:
    """Applies the provided operation to two integers."""
    return op(a, b)

# Example usage of the callable function
addition = lambda x, y: x + y
multiplication = lambda x, y: x * y

result_addition = apply_operation(addition, 3, 4)
result_multiplication = apply_operation(multiplication, 3, 4)

print(result_addition)   # Output: 7
print(result_multiplication) # Output: 12

6. Container Types

Types like Sequence, Iterable, and Mapping provide type hints for sequences of items.

from typing import *
import collections

# Function with type hint for a sequence of numbers
def calculate_sum(seq: Sequence[int]) -> int:
    """Calculates the sum of elements in the sequence."""
    return sum(seq)

# Example usage of the sequence function
numbers = [1, 2, 3, 4, 5]
result = calculate_sum(numbers)
print(result)  # Output: 15

# Function with type hint for an iterable of strings
def filter_strings_iter(iterable: Iterable[str]) -> Iterator[str]:
    """Filters out empty strings from the iterable."""
    return (s for s in iterable if s)

# Example usage of the iterable function
strings = ["apple", "", "banana", ""]
filtered_strings = list(filter_strings_iter(strings))
print(filtered_strings)  # Output: ['apple', 'banana']

7. Union Types

Use Union to indicate that a variable can be one of several types.

from typing import *

# Function with type hint for a union of string and int
def process_value(value: Union[str, int]) -> str:
    """Converts the value to a string."""
    if isinstance(value, str):
        return f"'{value}'"
    else:
        return str(value)

# Example usage of the union function
result1 = process_value("hello")
result2 = process_value(42)
print(result1)  # Output: 'hello'
print(result2)  # Output: '42'

8. Type Literals

Use Literal to denote a specific set of values.

from typing import *

# Function with type hint for a literal value
def greet(name: Literal["Alice", "Bob"]) -> str:
    """Returns a greeting message for the specified name."""
    return f"Hello, {name}!"

# Example usage of the literal function
message = greet("Alice")
print(message)  # Output: Hello, Alice!

These examples cover a wide range of functionalities provided by the typing module, including type annotations, type aliases, optional values, generic types, callable types, container types, union types, and type literals. Each example is accompanied by comments to explain the purpose and usage of each part of the code.

unittest - Unit testing framework.md

unittest - Unit testing framework

The unittest module is a powerful tool for writing unit tests in Python. It provides a flexible framework that allows you to create test cases, define assertions, and run tests programmatically. Below are comprehensive examples covering various functionalities of the unittest module.

Example 1: Basic Test Case

import unittest

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Set up any resources or state that need to be initialized before each test
        self.value = 10

    def tearDown(self):
        # Clean up any resources or state after each test
        pass

    def test_addition(self):
        # Test the addition of two numbers
        result = self.value + 5
        self.assertEqual(result, 15, "The sum should be 15")

    def test_subtraction(self):
        # Test the subtraction of a number from another number
        result = self.value - 3
        self.assertEqual(result, 7, "The difference should be 7")

if __name__ == '__main__':
    unittest.main()

Example 2: Test Case with Setup and Teardown

import unittest

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Set up any resources or state that need to be initialized before each test
        self.value = 10

    def tearDown(self):
        # Clean up any resources or state after each test
        pass

    def test_addition(self):
        # Test the addition of two numbers
        result = self.value + 5
        self.assertEqual(result, 15, "The sum should be 15")

    def test_subtraction(self):
        # Test the subtraction of a number from another number
        result = self.value - 3
        self.assertEqual(result, 7, "The difference should be 7")

    @classmethod
    def setUpClass(cls):
        # Set up any resources or state that need to be initialized before all tests
        cls.shared_resource = [1, 2, 3]

    @classmethod
    def tearDownClass(cls):
        # Clean up any resources or state after all tests
        del cls.shared_resource

if __name__ == '__main__':
    unittest.main()

Example 3: Test Case with Assertions

import unittest

class MyTestCase(unittest.TestCase):
    def test_greater_than(self):
        # Test if a value is greater than another
        self.assertGreater(15, 10, "15 should be greater than 10")

    def test_less_than_or_equal_to(self):
        # Test if a value is less than or equal to another
        self.assertLessEqual(10, 10, "10 should be less than or equal to 10")

    def test_is_instance(self):
        # Test if an object is an instance of a class
        self.assertIsInstance("Hello", str, "The string 'Hello' should be an instance of str")

if __name__ == '__main__':
    unittest.main()

Example 4: Test Case with Assertions for Exceptions

import unittest

class MyTestCase(unittest.TestCase):
    def test_division_by_zero(self):
        # Test if a division by zero raises a ZeroDivisionError
        self.assertRaises(ZeroDivisionError, lambda: 10 / 0)

    def test_invalid_input(self):
        # Test if an invalid input raises a ValueError
        with self.assertRaises(ValueError):
            int("a")

if __name__ == '__main__':
    unittest.main()

Example 5: Test Case with Parameterized Tests

import unittest
from parameterized import parameterized

class MyTestCase(unittest.TestCase):
    @parameterized.expand([
        (1, 2, 3),
        (4, 5, 9),
        (-1, -1, 0),
        (0, 0, 0)
    ])
    def test_addition_with_parameters(self, a, b, expected):
        # Test the addition of two numbers with parameterized inputs
        result = a + b
        self.assertEqual(result, expected, f"The sum should be {expected}")

if __name__ == '__main__':
    unittest.main()

Example 6: Test Case with Test Suite

import unittest

class TestCase1(unittest.TestCase):
    def test_addition(self):
        # Test the addition of two numbers in TestCase1
        self.assertEqual(5 + 5, 10)

class TestCase2(unittest.TestCase):
    def test_subtraction(self):
        # Test the subtraction of two numbers in TestCase2
        self.assertEqual(10 - 5, 5)

def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestCase1('test_addition'))
    suite.addTest(TestCase2('test_subtraction'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

Example 7: Test Case with Test Loader

import unittest

def load_tests(loader, tests=None, pattern='test_*.py'):
    if tests is None:
        tests = loader.discover('.')
    return tests

if __name__ == '__main__':
    suite = unittest.TestLoader().discover()
    runner = unittest.TextTestRunner()
    runner.run(suite)

These examples cover a range of functionalities within the unittest module, from basic test cases to more advanced features like parameterized testing and test loading. Each example is designed to be clear, concise, and suitable for integration into Python documentation.

unittest.mock - getting started.md

unittest.mock - getting started

The unittest.mock module is a powerful tool used for creating mock objects in Python, which are essential for testing purposes. These mocks allow you to simulate the behavior of real objects without executing them, making your tests more isolated and predictable.

Below are comprehensive code examples demonstrating how to use unittest.mock for various common use cases:

Example 1: Creating a Simple Mock Object

import unittest
from unittest.mock import MagicMock

class TestMyModule(unittest.TestCase):
    def test_simple_mock(self):
        # Create a mock object
        my_mock = MagicMock()

        # Use the mock object as if it were a real object
        my_mock.some_method.return_value = 'mocked result'

        # Assert that the method was called and return the expected value
        self.assertEqual(my_mock.some_method(), 'mocked result')
        self.assertTrue(my_mock.some_method.called)

    def test_arguments(self):
        # Create a mock object
        my_mock = MagicMock()

        # Specify that the method should be called with specific arguments
        my_mock.some_method.return_value = 'mocked result'
        my_mock.some_method.assert_called_once_with('arg1', 'arg2')

        # Assert that the method was called multiple times with different arguments
        my_mock.some_method.side_effect = ['result1', 'result2']
        self.assertEqual(my_mock.some_method('a', 'b'), 'result1')
        self.assertEqual(my_mock.some_method('c', 'd'), 'result2')
        self.assertTrue(my_mock.some_method.called)

    def test_calls(self):
        # Create a mock object
        my_mock = MagicMock()

        # Record all calls to the method
        my_mock.some_method('arg1', 'arg2')

        # Assert that the method was called with specific arguments
        self.assertEqual(len(my_mock.some_method.call_args_list), 1)
        self.assertEqual(my_mock.some_method.call_args_list[0], (('arg1', 'arg2'), {}))

    def test_call_counter(self):
        # Create a mock object
        my_mock = MagicMock()

        # Record all calls to the method
        my_mock.some_method()
        my_mock.some_method()
        my_mock.some_method()

        # Assert that the method was called 3 times
        self.assertEqual(my_mock.some_method.call_count, 3)

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

Example 2: Mocking a Class Method

import unittest
from unittest.mock import MagicMock

class MyClass:
    def some_method(self):
        return 'real result'

class TestMyClass(unittest.TestCase):
    def test_mock_class_method(self):
        # Create an instance of MyClass
        my_instance = MyClass()

        # Create a mock object for the class method
        my_mock = MagicMock(return_value='mocked result')

        # Replace the original class method with the mock
        MyClass.some_method = my_mock

        # Call the modified class method
        self.assertEqual(my_instance.some_method(), 'mocked result')
        self.assertTrue(MyClass.some_method.called)

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

Example 3: Mocking a Static Method

import unittest
from unittest.mock import MagicMock

class MyClass:
    @staticmethod
    def some_static_method(x):
        return x * 2

class TestMyClass(unittest.TestCase):
    def test_mock_static_method(self):
        # Create a mock object for the static method
        my_mock = MagicMock(return_value='mocked result')

        # Replace the original static method with the mock
        MyClass.some_static_method = my_mock

        # Call the modified static method
        self.assertEqual(MyClass.some_static_method(3), 'mocked result')
        self.assertTrue(my_mock.called)

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

Example 4: Mocking a Module Function

import unittest
from unittest.mock import patch

# Assuming we have a function `some_module.some_function` defined in `some_module.py`
with patch('some_module.some_function') as mock_some_function:
    # Modify the behavior of the mocked function
    mock_some_function.return_value = 'mocked result'

    # Import and use the module that contains the function
    from some_module import some_function

    # Call the mocked function
    result = some_function()

    # Assert the expected result
    self.assertEqual(result, 'mocked result')

Example 5: Mocking an External Library Function

import unittest
from unittest.mock import patch
import requests

# Replace the actual `requests.get` call with a mock
with patch('requests.get') as mock_get:
    # Modify the behavior of the mocked function to return a specific response
    mock_get.return_value.status_code = 200
    mock_get.return_value.json.return_value = {'data': 'mocked data'}

    # Make an HTTP request using the patched `requests`
    response = requests.get('https://example.com/api/data')

    # Assert that the mocked function was called with the expected URL
    self.assertEqual(mock_get.call_args.args[0], 'https://example.com/api/data')
    self.assertTrue(response.json() == {'data': 'mocked data'})

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

Example 6: Using patch Decorator

import unittest
from unittest.mock import patch
import requests

@patch('requests.get')
def test_patch_decorator(mock_get):
    # Modify the behavior of the mocked function to return a specific response
    mock_get.return_value.status_code = 200
    mock_get.return_value.json.return_value = {'data': 'mocked data'}

    # Make an HTTP request using the patched `requests`
    response = requests.get('https://example.com/api/data')

    # Assert that the mocked function was called with the expected URL
    self.assertEqual(mock_get.call_args.args[0], 'https://example.com/api/data')
    self.assertTrue(response.json() == {'data': 'mocked data'})

class TestRequestsPatching(unittest.TestCase):
    def test_example(self):
        test_patch_decorator()

if __name__ == '__main__':
    unittest.main(argv=[''], exit=False)

These examples cover basic mocking techniques using unittest.mock, including:

  1. Creating simple mock objects.
  2. Mocking class and static methods.
  3. Mocking module functions.
  4. Mocking external library functions.
  5. Using the patch decorator.

Each example includes detailed comments to explain the purpose of each step and how it relates to the functionality being tested. These examples are suitable for inclusion in official documentation, providing clear guidance on how to use unittest.mock effectively for testing purposes.

unittest.mock - mock object library.md

unittest.mock - mock object library

The unittest.mock module is a powerful tool for creating test doubles in Python, allowing you to isolate parts of your code that interact with external systems or dependencies. This module provides several useful functions and classes to help you simulate various scenarios in your tests.

Below are comprehensive examples for each functionality provided by the unittest.mock module:

Example 1: Basic Usage

import unittest
from unittest.mock import Mock, patch

class TestMockExample(unittest.TestCase):
    def test_basic_usage(self):
        # Create a mock object
        mock_object = Mock()

        # Call the mock object
        mock_object.method_name()

        # Check if the method was called
        self.assertTrue(mock_object.method_name.called)

        # Get the arguments passed to the method
        args, kwargs = mock_object.method_name.call_args

        # Assert that no additional calls were made
        self.assertFalse(mock_object.method_name.called_more_than_once())

if __name__ == '__main__':
    unittest.main()

Example 2: Mocking Functions

import unittest
from unittest.mock import patch, MagicMock

class TestMockFunction(unittest.TestCase):
    def test_mock_function(self):
        # Use a partial to mock a function from another module
        with patch('module_name.function_name') as mock_func:
            mock_func.return_value = "Mocked Output"
            result = module_name.function_name()
            self.assertEqual(result, "Mocked Output")
            mock_func.assert_called_once()

    def test_mocking_builtin_function(self):
        # Mock the built-in `open` function
        with patch('builtins.open', return_value=MagicMock()) as mock_open:
            mock_file_obj = mock_open.return_value
            mock_file_obj.read.return_value = "Mocked File Content"
            content = open("example.txt").read()
            self.assertEqual(content, "Mocked File Content")
            mock_open.assert_called_once_with('example.txt')

if __name__ == '__main__':
    unittest.main()

Example 3: Mocking Classes

import unittest
from unittest.mock import patch, MagicMock

class TestMockClass(unittest.TestCase):
    def test_mock_class(self):
        # Create a mock class instance
        with patch('module_name.MyClass') as mock_cls:
            mock_obj = mock_cls.return_value
            mock_obj.method_name.return_value = "Mocked Method Output"
            result = MyClass().method_name()
            self.assertEqual(result, "Mocked Method Output")
            mock_obj.method_name.assert_called_once()

    def test_mock_subclass(self):
        # Mock a subclass of a class
        with patch('module_name.BaseClass') as mock_base:
            mock_base.return_value = MagicMock(spec=BaseClass)
            mock_base.instance_method.return_value = "Mocked Instance Method Output"
            instance = BaseClass()
            result = instance.instance_method()
            self.assertEqual(result, "Mocked Instance Method Output")
            mock_base.assert_called_once()

if __name__ == '__main__':
    unittest.main()

Example 4: Mocking with Arguments

import unittest
from unittest.mock import patch

class TestMockWithArguments(unittest.TestCase):
    def test_mock_with_arguments(self):
        # Create a mock object and specify the expected arguments
        mock_object = Mock()

        # Call the mock object with specific arguments
        mock_object.method_name('arg1', arg2='value2')

        # Check if the method was called with the correct arguments
        args, kwargs = mock_object.method_name.call_args

        self.assertEqual(args[0], 'arg1')
        self.assertEqual(kwargs['arg2'], 'value2')

    def test_mock_with_mixed_arguments(self):
        # Create a mock object and specify expected keyword arguments
        mock_object = Mock()

        # Call the mock object with both positional and keyword arguments
        mock_object.method_name('arg1', arg2='value2')

        # Check if the method was called with the correct arguments
        args, kwargs = mock_object.method_name.call_args

        self.assertEqual(args[0], 'arg1')
        self.assertEqual(kwargs['arg2'], 'value2')

if __name__ == '__main__':
    unittest.main()

Example 5: Mocking with Side Effects

import unittest
from unittest.mock import patch, MagicMock

class TestMockSideEffects(unittest.TestCase):
    def test_mock_side_effects(self):
        # Create a mock object and define a side effect function
        mock_object = Mock(side_effect=lambda x: x * 2)

        # Call the mock object with different inputs
        result1 = mock_object(3)
        result2 = mock_object('a')

        # Check if the results match the expected outputs
        self.assertEqual(result1, 6)
        self.assertEqual(result2, 'aa')

    def test_mock_with_raising_side_effects(self):
        # Create a mock object and define a side effect that raises an exception
        mock_object = Mock(side_effect=Exception("Mocked Exception"))

        # Call the mock object to see if it raises an exception
        with self.assertRaises(Exception) as context:
            mock_object()

        # Check if the exception matches the expected message
        self.assertEqual(str(context.exception), "Mocked Exception")

if __name__ == '__main__':
    unittest.main()

Example 6: Mocking with Return Values

import unittest
from unittest.mock import patch, MagicMock

class TestMockReturnValues(unittest.TestCase):
    def test_mock_return_values(self):
        # Create a mock object and define the return value for different calls
        mock_object = Mock(return_value="Initial Return")

        # First call to get the initial return value
        result1 = mock_object()
        self.assertEqual(result1, "Initial Return")

        # Second call to use the default side effect (returns 0)
        result2 = mock_object()
        self.assertEqual(result2, 0)

    def test_mock_with_mixed_return_values(self):
        # Create a mock object and define different return values for specific inputs
        mock_object = Mock(side_effect=lambda x: {
            1: "One",
            2: "Two"
        }.get(x, 3))

        # Call the mock object with different inputs
        result1 = mock_object(1)
        result2 = mock_object(2)
        result3 = mock_object(3)

        # Check if the results match the expected outputs
        self.assertEqual(result1, "One")
        self.assertEqual(result2, "Two")
        self.assertEqual(result3, 3)

if __name__ == '__main__':
    unittest.main()

Example 7: Mocking with Return Value Count

import unittest
from unittest.mock import patch, MagicMock

class TestMockReturnValueCount(unittest.TestCase):
    def test_mock_return_value_count(self):
        # Create a mock object and set the return value count
        mock_object = Mock(return_value="Initial Return", side_effect=1)

        # Call the mock object multiple times to check the return values
        result1 = mock_object()
        result2 = mock_object()

        # Check if the first call returns the initial return value, and subsequent calls raise an exception
        self.assertEqual(result1, "Initial Return")
        with self.assertRaises(ValueError):
            mock_object()

    def test_mock_with_mixed_return_value_count(self):
        # Create a mock object and set different return values for specific inputs and a side effect count
        mock_object = Mock(return_value="Initial Return", side_effect=[lambda x: x * 2, lambda x: x + 1])

        # Call the mock object with different inputs to check the return values
        result1 = mock_object(1)
        result2 = mock_object(2)

        # Check if the results match the expected outputs
        self.assertEqual(result1, 2)  # Double of input 1
        self.assertEqual(result2, 3)  # Input 2 plus 1

if __name__ == '__main__':
    unittest.main()

Example 8: Mocking with Side Effect and Return Value Count

import unittest
from unittest.mock import patch, MagicMock

class TestMockSideEffectAndReturnValueCount(unittest.TestCase):
    def test_mock_side_effect_and_return_value_count(self):
        # Create a mock object and set the side effect and return value count
        mock_object = Mock(side_effect=[lambda x: x * 2, lambda x: x + 1], return_value="Initial Return", side_effect_count=2)

        # Call the mock object multiple times to check the return values and exceptions
        result1 = mock_object(1)
        result2 = mock_object(2)
        result3 = mock_object(3)

        # Check if the results match the expected outputs and subsequent calls raise an exception
        self.assertEqual(result1, 2)  # Double of input 1
        self.assertEqual(result2, 3)  # Input 2 plus 1
        with self.assertRaises(ValueError):
            mock_object()

if __name__ == '__main__':
    unittest.main()

These examples demonstrate various ways to use the unittest.mock module to create and configure mock objects for testing in Python. Each example includes comments explaining key points, such as setting return values, mocking function calls, handling side effects, and checking argument counts.

File and Directory Access

filecmp - File and Directory Comparisons.md

filecmp - File and Directory Comparisons

The filecmp module in Python provides utilities to compare files or directories for equality, modification times, and more. Below are comprehensive examples of how to use each function and class in the filecmp module.

1. cmp

The cmp() function compares two files and returns: - 0 if both files are identical. - A negative integer if the first file is older than the second file. - A positive integer otherwise.

import filecmp

# Example usage
filecmp.cmp('source.txt', 'destination.txt')

2. cmpfiles

The cmpfiles() function compares two sets of files and returns: - Three lists: [same_files, different_files, missing_files].

import filecmp

# Example usage
common, diff, miss = filecmp.cmpfiles('source_dir', 'destination_dir', ['file1.txt', 'file2.txt'])
print("Same Files:", common)
print("Different Files:", diff)
print("Missing Files:", miss)

3. dircmp

The dircmp() function compares two directories and provides a comprehensive comparison of their contents.

import filecmp

# Example usage
dir_cmp = filecmp.dircmp('source_dir', 'destination_dir')
print("Common files:", dir_cmp.common)
print("Different files:", dir_cmp.diff_files)
print("Common subdirectories:", dir_cmp.common_dirs)
print("Subdirectory of source but not destination:", dir_cmp.left_only)
print("Subdirectory of destination but not source:", dir_cmp.right_only)

# Optionally, walk through directories
for root, dirs, files in os.walk(dir_cmp.left):
    for file in files:
        rel_path = os.path.join(root, file)
        print("File from source:", rel_path)

for root, dirs, files in os.walk(dir_cmp.right):
    for file in files:
        rel_path = os.path.join(root, file)
        print("File from destination:", rel_path)

4. filecmp.dircmpobj

The dircmp() function returns an instance of dircmpobj which can be used to compare directories and their contents.

import filecmp

# Example usage
dir_cmp = filecmp.dircmp('source_dir', 'destination_dir')

# Print detailed information about the comparison
print(dir_cmp.left, "and", dir_cmp.right)
print("Common files:", dir_cmp.common)
print("Different files:", dir_cmp.diff_files)
print("Common subdirectories:", dir_cmp.common_dirs)

# Walk through directories using the dircmpobj
for root, dirs, files in dir_cmp.walk():
    for file in files:
        print(f"File found at: {os.path.join(root, file)}")

5. subprocess.run

The subprocess.run() function can be used to compare directories using the external command diff.

import subprocess

# Example usage
result = subprocess.run(['diff', 'source_dir', 'destination_dir'], capture_output=True)
print("Diff Output:")
print(result.stdout.decode('utf-8'))

6. filecmp.cmpfiles() with patterns

You can specify file patterns to include or exclude during comparison.

import filecmp

# Example usage
common, diff, miss = filecmp.cmpfiles('source_dir', 'destination_dir',
                                        ['*.txt'], ['.gitignore'])
print("Common files:", common)
print("Different files:", diff)
print("Missing files:", miss)

7. filecmp.cmp() with custom comparison logic

You can define a custom function for comparison using the use_cse parameter.

import filecmp

def custom_cmp(file1, file2):
    # Custom comparison logic here
    return True  # Return False if files are different, otherwise True

# Example usage
filecmp.cmp('source.txt', 'destination.txt', use_cse=custom_cmp)

8. filecmp.cmp() with binary comparison

If you need to compare files for content equality without considering file attributes like size and modification time, set shallow to False.

import filecmp

# Example usage
result = filecmp.cmp('source.txt', 'destination.txt', use_cse=False)
print("Files are", "equal" if result else "different")

9. filecmp.dircmp() with ignore patterns

You can specify patterns to be ignored during the comparison.

import filecmp

# Example usage
dir_cmp = filecmp.dircmp('source_dir', 'destination_dir',
                           ['*.txt'], ['.gitignore'])
print("Common files:", dir_cmp.common)
print("Different files:", dir_cmp.diff_files)
print("Common subdirectories:", dir_cmp.common_dirs)

10. filecmp.cmp() with shallow comparison

If you only want to compare the file sizes and modification times without opening the files, set shallow to True.

import filecmp

# Example usage
result = filecmp.cmp('source.txt', 'destination.txt', use_cse=False, shallow=True)
print("Files are", "equal" if result else "different")

These examples demonstrate various ways to use the filecmp module in Python for comparing files and directories. Each example is well-documented and includes comments explaining the functionality.

fileinput - Iterate over lines from multiple input streams.md

fileinput - Iterate over lines from multiple input streams

The fileinput module is a part of Python's standard library that provides an easy way to read from multiple files or standard input. It allows you to process each line from each of these inputs in sequence, handling various options such as skipping blank lines and processing only certain lines based on their position.

Here are some comprehensive code examples for the fileinput module:

Example 1: Iterating Over Multiple Files

This example reads lines from multiple files sequentially and prints them. It handles empty lines by checking if they contain any content.

import fileinput

# List of files to read
files_to_read = ['file1.txt', 'file2.txt']

# Iterate over each line in the specified files
for line in fileinput.input(files=files_to_read):
    # Check if the line is not empty before processing
    if line:
        print(line.strip())  # Print each non-empty line after stripping whitespace

# Clean up any open files
fileinput.close()

Example 2: Skipping Blank Lines

This example demonstrates how to skip blank lines when reading from multiple files. It uses the fileinput.SKIP_BLANK_LINES option.

import fileinput

# List of files to read
files_to_read = ['file1.txt', 'file2.txt']

# Iterate over each line in the specified files, skipping empty ones
for line in fileinput.input(files=files_to_read, inplace=True):
    # Check if the line is not empty before processing
    if line:
        print(line.strip())  # Print each non-empty line after stripping whitespace

# Clean up any open files
fileinput.close()

Example 3: Processing Lines Based on Position

This example shows how to process lines based on their position in each file. It uses the lineno attribute available in the fileinput module.

import fileinput

# List of files to read
files_to_read = ['file1.txt', 'file2.txt']

# Iterate over each line in the specified files, processing lines based on position
for line_num, line in enumerate(fileinput.input(files=files_to_read)):
    if line:
        # Print the line number and the content
        print(f"Line {line_num + 1}: {line.strip()}")

# Clean up any open files
fileinput.close()

Example 4: Using inplace Mode

This example uses the inplace mode to modify lines in place, allowing you to edit multiple files simultaneously.

import fileinput

# List of files to read and modify
files_to_modify = ['file1.txt', 'file2.txt']

# Iterate over each line in the specified files, modifying them if necessary
for line_num, line in enumerate(fileinput.input(files=files_to_modify, inplace=True)):
    # Check if the line is not empty before processing
    if line:
        # Modify the line (e.g., change 'old' to 'new')
        modified_line = line.replace('old', 'new').strip()
        print(modified_line)  # Print the modified line

# Clean up any open files
fileinput.close()

Example 5: Handling Unicode Input

This example demonstrates how to handle Unicode input when reading from multiple files. It uses the encoding parameter to specify the encoding.

import fileinput

# List of files to read
files_to_read = ['file1.txt', 'file2.txt']

# Iterate over each line in the specified files, handling UTF-8 encoding
for line in fileinput.input(files=files_to_read, encoding='utf-8'):
    # Print the line after decoding it from bytes
    print(line.decode('utf-8'))

# Clean up any open files
fileinput.close()

These examples cover various aspects of using the fileinput module, including reading from multiple files, handling blank lines, processing lines based on position, modifying files in place, and handling Unicode input. Each example is self-contained and should be clear for inclusion in documentation or use cases where these functionalities are required.

fnmatch - Unix filename pattern matching.md

fnmatch - Unix filename pattern matching

The fnmatch module is used to perform shell-style pattern matching on filenames, which is particularly useful for applications that need to handle file paths and patterns according to common Unix/Linux conventions. Below are comprehensive code examples demonstrating various functionalities of the fnmatch module.

Example 1: Basic Pattern Matching

import fnmatch

# Define a list of filenames
filenames = [
    "document.txt",
    "images.png",
    "notes.pdf",
    "backup.tar.gz",
    "README.md"
]

# Define patterns to match files with ".txt" or ".md" extensions
patterns = ["*.txt", "*.md"]

# Use fnmatch.filter() to find filenames that match the patterns
matched_filenames = []
for pattern in patterns:
    matched_filenames.extend(fnmatch.filter(filenames, pattern))

# Print the matched filenames
print("Matched filenames:", matched_filenames)

Explanation:

Example 2: Case Insensitive Matching

import fnmatch

# Define a list of filenames with mixed cases
filenames = [
    "Document.txt",
    "Images.png",
    "Notes.pdf",
    "BACKUP.tar.gz",
    "README.md"
]

# Define case-insensitive patterns to match files ending with ".txt" or ".md"
patterns = ["*.txt", "*.md"]

# Convert the patterns to case-insensitive versions
case_insensitive_patterns = [fnmatch.translate(pattern) for pattern in patterns]

# Use fnmatch.filter() with the translated patterns for case-insensitive matching
matched_filenames = []
for pattern in case_insensitive_patterns:
    matched_filenames.extend(fnmatch.filter(filenames, pattern))

# Print the matched filenames
print("Matched filenames:", matched_filenames)

Explanation:

Example 3: Using Wildcards in Patterns

import fnmatch

# Define a list of filenames with different extensions
filenames = [
    "file1.txt",
    "file2.docx",
    "file3.pdf",
    "file4.xlsx",
    "file5.jpg"
]

# Define patterns to match files ending with ".txt" or ".docx"
patterns = ["*.txt", "*.docx"]

# Use fnmatch.filter() to find filenames that match the patterns
matched_filenames = []
for pattern in patterns:
    matched_filenames.extend(fnmatch.filter(filenames, pattern))

# Print the matched filenames
print("Matched filenames:", matched_filenames)

Explanation:

Example 4: Matching Multiple Patterns

import fnmatch

# Define a list of filenames
filenames = [
    "file1.txt",
    "file2.docx",
    "file3.pdf",
    "file4.xlsx",
    "file5.jpg"
]

# Define multiple patterns to match files ending with ".txt", ".docx", or ".pdf"
patterns = ["*.txt", "*.docx", "*.pdf"]

# Use fnmatch.filter() with each pattern in the list
matched_filenames = []
for pattern in patterns:
    matched_filenames.extend(fnmatch.filter(filenames, pattern))

# Print the matched filenames
print("Matched filenames:", matched_filenames)

Explanation:

Example 5: Using Regular Expressions for More Complex Patterns

import fnmatch

# Define a list of filenames
filenames = [
    "file1.txt",
    "file2.docx",
    "file3.pdf",
    "file4.xlsx",
    "file5.jpg"
]

# Define a regular expression pattern to match files ending with ".txt", ".docx", or ".pdf"
pattern = r'\.(txt|docx|pdf)$'

# Use fnmatch.filter() with the regular expression pattern
matched_filenames = fnmatch.filter(filenames, pattern)

# Print the matched filenames
print("Matched filenames:", matched_filenames)

Explanation:

Conclusion

The fnmatch module provides flexible and powerful tools for matching filenames according to Unix/Linux conventions. By understanding how to define patterns and use them with various functions like filter(), you can effectively manage file paths in your Python applications.

glob - Unix style pathname pattern expansion.md

glob - Unix style pathname pattern expansion

The glob module in Python provides a function called glob() that is used to expand Unix-style pathname patterns into a list of matching file names. This can be very useful for finding files based on specific naming conventions or patterns.

Below are comprehensive examples demonstrating various functionalities and use cases of the glob module:

import glob
import os

# Example 1: Basic usage
# Find all .txt files in the current directory
print(glob.glob("*.txt"))

# Example 2: Search for files in a specific directory
# Find all .pdf files in the '/home/user/documents' directory
print(glob.glob("/home/user/documents/*.pdf"))

# Example 3: Use wildcards to match multiple file extensions
# Find all files with any of the following extensions: txt, pdf, docx
print(glob.glob("*.txt *.pdf *.docx"))

# Example 4: Find files with a specific prefix and suffix
# Find all files starting with 'report' and ending with '.doc'
print(glob.glob("report*.doc"))

# Example 5: Find files in multiple directories
# Use an absolute path to find all .py files in the home directory and its subdirectories
print(glob.glob("/home/user/**/*.py", recursive=True))

# Example 6: Find files with a specific pattern in their names
# Find all files containing 'summary' in their name
print(glob.glob("*summary*"))

# Example 7: Using shell-style wildcards
# Use ! to exclude specific patterns
print(glob.glob("*.txt !(*.log)"))  # Exclude .log files

# Example 8: Finding hidden files (files starting with a dot)
# Find all hidden files in the current directory
print(glob.glob(".?*"))

# Example 9: Using glob() with a function to filter results
def is_text_file(file_path):
    return file_path.endswith(".txt")

# Use list comprehension to find .txt files
for txt_file in [f for f in glob.iglob("*.txt") if is_text_file(f)]:
    print(txt_file)

# Example 10: Using glob() with a generator to handle large directories efficiently
def find_large_files(directory, size_threshold):
    for file_path in glob.iglob(f"{directory}/**/*", recursive=True):
        if os.path.getsize(file_path) > size_threshold:
            yield file_path

# Find all files larger than 10MB in the '/home/user/documents' directory
for large_file in find_large_files("/home/user/documents", 10 * 1024 * 1024):
    print(large_file)

Explanation of Examples:

  1. Basic Usage: This example demonstrates the simplest use case where you want to list all files with a specific extension in the current directory.

  2. Search in Specific Directory: Shows how to search for files in a particular directory using an absolute path.

  3. Multiple File Extensions: Demonstrates finding files with multiple extensions at once.

  4. Prefix and Suffix Patterns: Searches for files that match both a prefix and a suffix.

  5. Recursive Search: Uses recursive=True to find files in all subdirectories of a specified directory.

  6. Pattern Matching: Uses wildcards like * and ? to match filenames based on patterns.

  7. Excluding Files with Specific Patterns: Demonstrates how to exclude certain files using the ! wildcard.

  8. Hidden Files: Finds files that start with a dot, which are typically hidden in Unix-like systems.

  9. Filtering Results: Uses a filter function to apply custom logic for selecting matching files.

  10. Generator for Large Datasets: Utilizes generators and os.path.getsize() to efficiently handle large datasets without loading everything into memory at once.

These examples cover a wide range of use cases for the glob module, demonstrating its flexibility and power in file path expansion.

linecache - Random access to text lines.md

linecache - Random access to text lines

The linecache module provides a way to access lines of files, even if the file is not open or has been changed since it was last accessed. This can be particularly useful when you need to process large files without reading them entirely into memory.

Here are some comprehensive code examples for using the linecache module:

Example 1: Retrieve a line from a file

import linecache

# Specify the path to the file and the line number
file_path = '/path/to/your/file.txt'
line_number = 5

try:
    # Get the specified line from the file
    line_content = linecache.getline(file_path, line_number)

    print(f"Line {line_number} in '{file_path}':")
    print(line_content.strip())  # Remove any trailing newline character
except FileNotFoundError:
    print("The file does not exist.")

Example 2: Retrieve all lines from a file and store them in a list

import linecache

# Specify the path to the file
file_path = '/path/to/your/file.txt'

try:
    # Get all lines from the file into a list
    with open(file_path, 'r') as file:
        lines = file.readlines()

    print("All lines in '{file_path}':")
    for line in lines:
        print(line.strip())
except FileNotFoundError:
    print("The file does not exist.")

Example 3: Store the contents of a file in memory and retrieve a specific line

import linecache

# Specify the path to the file
file_path = '/path/to/your/file.txt'

try:
    # Load all lines into memory
    lines = linecache.getlines(file_path)

    # Specify the line number
    line_number = 3

    print(f"Line {line_number} in '{file_path}':")
    print(lines[line_number - 1].strip())  # Adjust for zero-based indexing
except FileNotFoundError:
    print("The file does not exist.")

Example 4: Clear the cache to free up memory

import linecache

# Specify the path to the file
file_path = '/path/to/your/file.txt'

try:
    # Get a line from the file
    line_content = linecache.getline(file_path, 1)

    print(f"Line 1 in '{file_path}':")
    print(line_content.strip())
except FileNotFoundError:
    print("The file does not exist.")

# Clear the cache to free up memory
linecache.clearcache()

Example 5: Retrieve lines from multiple files and process them

import linecache

# List of file paths
file_paths = ['/path/to/file1.txt', '/path/to/file2.txt']

try:
    # Retrieve all lines from each file
    for file_path in file_paths:
        with open(file_path, 'r') as file:
            lines = file.readlines()

        print(f"Lines in '{file_path}':")
        for line in lines:
            print(line.strip())
except FileNotFoundError:
    print("One or more files do not exist.")

Example 6: Handle errors gracefully using try-except blocks

import linecache

# Specify the path to a file that might not exist
file_path = '/path/to/nonexistent_file.txt'

try:
    # Attempt to retrieve a line from the non-existent file
    line_content = linecache.getline(file_path, 1)

    print(f"Line 1 in '{file_path}':")
    print(line_content.strip())
except FileNotFoundError as e:
    print(f"An error occurred: {e}")

Example 7: Store and retrieve lines in a context manager

import linecache

class LineCacheManager:
    def __init__(self, file_path):
        self.file_path = file_path
        self.lines = None

    def load_lines(self):
        with open(self.file_path, 'r') as file:
            self.lines = file.readlines()

    def get_line(self, line_number):
        if self.lines is None:
            self.load_lines()

        return self.lines[line_number - 1].strip()

# Usage
manager = LineCacheManager('/path/to/your/file.txt')
try:
    line_content = manager.get_line(5)
    print(f"Line 5 in '{file_path}':")
    print(line_content.strip())
except IndexError:
    print("The specified line number is out of range.")

Example 8: Use linecache with a list to store lines and process them

import linecache

# List of file paths
file_paths = ['/path/to/file1.txt', '/path/to/file2.txt']

lines_data = []

try:
    # Retrieve all lines from each file and store in a list
    for file_path in file_paths:
        with open(file_path, 'r') as file:
            lines = file.readlines()

        lines_data.extend(lines)

    print("All lines processed:")
    for line in lines_data:
        print(line.strip())
except FileNotFoundError:
    print("One or more files do not exist.")

These examples cover various use cases of the linecache module, from basic retrieval to handling errors and storing results. Each example includes comments for clarity and best practices are followed throughout the code.

os.path - Common pathname manipulations.md

os.path - Common pathname manipulations

The os.path module in Python provides a portable way of using operating system dependent functionality related to files and directories. Below are comprehensive examples demonstrating various functionalities of the os.path module, along with explanations for each example:

import os

# Example 1: Joining paths
# Joining multiple parts into a single path
path_parts = ['home', 'user', 'documents', 'report.docx']
full_path = os.path.join(*path_parts)
print(f"Full Path: {full_path}")

# Example 2: Splitting paths
# Splitting the full path into directory and file components
dir_name, file_name = os.path.split(full_path)
print(f"Directory Name: {dir_name}")
print(f"File Name: {file_name}")

# Example 3: Checking if a file or directory exists
# Using os.path.exists() to check for existence of a file or directory
file_path = 'path/to/my_file.txt'
if os.path.exists(file_path):
    print("File exists.")
else:
    print("File does not exist.")

# Example 4: Getting the last modification time of a file
# Using os.path.getmtime() to get the modification time of a file
import datetime
if os.path.exists(file_path):
    modification_time = os.path.getmtime(file_path)
    print(f"Last Modification Time: {datetime.datetime.fromtimestamp(modification_time)}")
else:
    print("File does not exist.")

# Example 5: Checking if a path is absolute
# Using os.path.isabs() to check if a path is absolute
absolute_path = os.path.abspath(full_path)
print(f"Is Absolute Path: {os.path.isabs(absolute_path)}")

# Example 6: Getting the current working directory
# Using os.getcwd() to get the current working directory
current_directory = os.getcwd()
print(f"Current Working Directory: {current_directory}")

# Example 7: Changing the current working directory
# Using os.chdir() to change the current working directory
try:
    new_directory = 'path/to/new/directory'
    os.chdir(new_directory)
    print("Changed Current Directory.")
except FileNotFoundError:
    print("Directory does not exist.")

# Example 8: Listing all files in a directory
# Using os.listdir() to list all files and directories in a directory
if os.path.isdir(current_directory):
    for item in os.listdir(current_directory):
        print(item)
else:
    print("Path is not a directory.")

# Example 9: Checking if a path is a directory
# Using os.path.isdir() to check if a path is a directory
directory_path = 'path/to/my_directory'
if os.path.isdir(directory_path):
    print("This is a directory.")
else:
    print("This is not a directory.")

# Example 10: Getting the size of a file in bytes
# Using os.path.getsize() to get the size of a file
file_size = os.path.getsize(file_path)
print(f"File Size (bytes): {file_size}")

# Example 11: Creating a new directory
# Using os.makedirs() to create multiple directories
try:
    new_dir_path = 'path/to/new/directory'
    os.makedirs(new_dir_path, exist_ok=True)
    print("Directory created.")
except FileExistsError:
    print("Directory already exists.")

# Example 12: Removing an empty directory
# Using os.rmdir() to remove a non-empty directory if it is empty
try:
    dir_to_remove = 'path/to/directory'
    os.rmdir(dir_to_remove)
    print("Directory removed.")
except FileNotFoundError:
    print("Directory does not exist.")

# Example 13: Removing a file
# Using os.remove() to delete a file
try:
    file_to_remove = 'path/to/my_file.txt'
    os.remove(file_to_remove)
    print("File deleted.")
except FileNotFoundError:
    print("File does not exist.")

# Example 14: Renaming a directory or file
# Using os.rename() to rename a file or directory
new_name = 'new_name_for_my_file.docx'
os.rename(file_path, new_name)
print(f"Renamed file from {file_path} to {new_name}")

# Example 15: Getting the absolute path of a symbolic link
# Using os.path.realpath() for resolving symbolic links
real_path = os.path.realpath('path/to/symbolic_link')
print(f"Real Path: {real_path}")

# Example 16: Checking if two paths point to the same file or directory
# Using os.path.samefile() to compare paths
other_file_path = 'path/to/another_file.txt'
if os.path.samefile(file_path, other_file_path):
    print("Both paths point to the same file.")
else:
    print("Paths do not point to the same file.")

# Example 17: Getting the extension of a path
# Using os.path.splitext() to get the extension of a file
base_name, extension = os.path.splitext(file_path)
print(f"Base Name: {base_name}")
print(f"Extension: {extension}")

# Example 18: Removing an empty directory recursively (for directories with contents)
# Note: This will only remove empty directories. For non-empty directories, use shutil.rmtree()
dir_to_remove_recursive = 'path/to/directory_with_contents'
os.rmdir(dir_to_remove_recursive)  # This will raise an error as it's not empty

# Example 19: Creating a symbolic link
# Using os.symlink() to create a symbolic link
try:
    symlink_path = 'path/to/symlink'
    source_file = 'path/to/source/file.txt'
    os.symlink(source_file, symlink_path)
    print("Symbolic Link created.")
except FileExistsError:
    print("Symlink already exists.")

# Example 20: Checking if a path is a symbolic link
# Using os.path.islink() to check if a path is a symbolic link
if os.path.islink(symlink_path):
    print("This is a symbolic link.")
else:
    print("This is not a symbolic link.")

Explanation:

Each example includes error handling for cases where the paths might not exist, providing clear output to verify the results.

pathlib - Object-oriented filesystem paths.md

pathlib - Object-oriented filesystem paths

Below are comprehensive examples of how to use each functionality provided by the pathlib module in Python 3.12. Each example is well-documented with comments explaining each step.

from pathlib import Path

# Example 1: Create a new Path object for a file or directory
file_path = Path("example.txt")
directory_path = Path("documents")

print(file_path)    # Output: PosixPath('example.txt')
print(directory_path)  # Output: PosixPath('documents')

# Example 2: Check if the path exists and is a file or directory
if file_path.exists():
    print("File exists:", file_path)
else:
    print("File does not exist")

if directory_path.exists() and directory_path.is_dir():
    print("Directory exists:", directory_path)
else:
    print("Directory does not exist")

# Example 3: Create a new directory if it doesn't exist
new_directory = Path("new_directory")
if not new_directory.exists():
    new_directory.mkdir(parents=True, exist_ok=True)

print("New directory created:", new_directory)

# Example 4: Move or rename a file or directory
original_file_path = Path("example.txt")
target_file_path = Path("backup/example_backup.txt")

if original_file_path.exists():
    target_file_path.parent.mkdir(parents=True, exist_ok=True)  # Ensure target directory exists
    original_file_path.rename(target_file_path)
    print("File moved to:", target_file_path)
else:
    print("File does not exist")

# Example 5: List all files and directories in a directory
if directory_path.exists():
    for item in directory_path.iterdir():
        if item.is_file():
            print(f"File: {item}")
        elif item.is_dir():
            print(f"Directory: {item}")

# Example 6: Get the absolute path of a relative path
relative_path = Path("example.txt")
absolute_path = relative_path.resolve()
print("Absolute path:", absolute_path)

# Example 7: Check if a path is an absolute path
if absolute_path.is_absolute():
    print("Path is absolute.")
else:
    print("Path is not absolute.")

# Example 8: Get the name of the file or directory without extension
file_name_without_extension = file_path.stem
print("File name without extension:", file_name_without_extension)

# Example 9: Get the extension of a file
file_extension = file_path.suffix
print("File extension:", file_extension)

# Example 10: Walk through directories and files recursively
if directory_path.exists():
    for item in directory_path.rglob("*"):
        if item.is_file():
            print(f"File found: {item}")

# Example 11: Normalize a path by resolving all symbolic links and redundant references
normalized_path = Path("example.txt")
real_path = normalized_path.resolve()
print("Normalized and resolved path:", real_path)

# Example 12: Join paths to create a new path object
combined_path = file_path.parent / "backup" / "example_backup.txt"
print("Combined path:", combined_path)

Explanation:

These examples cover a wide range of functionalities provided by the pathlib module, demonstrating how to work with file and directory paths in Python.

shutil - High-level file operations.md

shutil - High-level file operations

Certainly! Below are comprehensive code examples for various functionalities in the shutil module, which provides a high-level interface for common file operations in Python.

1. Copying Files and Directories

import shutil
import os

# Example 1: Copy a single file to a new location
source_file = 'example.txt'
destination_file = 'example_copied.txt'

if os.path.exists(source_file):
    shutil.copy(source_file, destination_file)
    print(f"Copied {source_file} to {destination_file}")
else:
    print(f"Source file {source_file} does not exist.")

# Example 2: Copy all contents of a directory to another directory (not the directory itself)
source_dir = 'source_directory'
destination_dir = 'destination_directory'

if os.path.exists(source_dir):
    shutil.copytree(source_dir, destination_dir)
    print(f"Copied contents of {source_dir} to {destination_dir}")
else:
    print(f"Source directory {source_dir} does not exist.")

2. Moving Files and Directories

import shutil
import os

# Example 1: Move a file to a new location
source_file = 'example.txt'
destination_file = 'example_moved.txt'

if os.path.exists(source_file):
    shutil.move(source_file, destination_file)
    print(f"Moved {source_file} to {destination_file}")
else:
    print(f"Source file {source_file} does not exist.")

# Example 2: Rename or move a directory (not the contents of the directory)
source_dir = 'source_directory'
new_name = 'moved_directory'

if os.path.exists(source_dir):
    shutil.move(source_dir, new_name)
    print(f"Renamed/Moved {source_dir} to {new_name}")
else:
    print(f"Source directory {source_dir} does not exist.")

3. Deleting Files and Directories

import shutil
import os

# Example 1: Move a file to a new location
source_file = 'example.txt'
destination_file = 'example_moved.txt'

if os.path.exists(source_file):
    shutil.move(source_file, destination_file)
    print(f"Moved {source_file} to {destination_file}")
else:
    print(f"Error: {source_file} does not exist")

# Example 2: Rename or move a directory (not the contents of the directory)
source_dir = 'source_directory'
new_name = 'moved_directory'

if os.path.exists(source_dir):
    shutil.move(source_dir, new_name)
    print(f"Renamed/Moved {source_dir} to {new_name}")
else:
    print(f"Error: {source_dir} does not exist")

4. Copying Files with Permissions

import shutil

# Example 1: Copy a file while preserving permissions
import shutil
import os

# Example 1: Copy a file while preserving permissions
source_file = 'example.txt'
destination_file = 'example_copied_with_permissions.txt'

if os.path.exists(source_file):
    shutil.copy2(source_file, destination_file)
    print(f"Copied {source_file} to {destination_file} with permissions")
else:
    print(f"Error: {source_file} does not exist")

5. Archiving Files

import shutil
import tarfile

# Example 1: Create a .tar archive from a directory
import shutil
import tarfile
import os

# Example 1: Create a .tar archive from a directory
source_dir = 'source_directory'
archive_name = 'example.tar'

if os.path.exists(source_dir):
    with tarfile.open(archive_name, mode='w') as tar:
        tar.add(source_dir)
    print(f"Created {archive_name} from {source_dir}")
else:
    print(f"Error: {source_dir} does not exist")

# Example 2: Extract a .tar archive to a directory
archive_to_extract = 'example.tar'
extract_path = 'extracted_directory'

if os.path.exists(archive_to_extract) and os.path.getsize(archive_to_extract) > 0:
    with tarfile.open(archive_to_extract, mode='r') as tar:
        tar.extractall(path=extract_path)
    print(f"Extracted {archive_name} to {extract_path}")
else:
    print(f"Error: {archive_to_extract} does not exist or is empty")

6. Compressing Files

import shutil
import gzip
import os

# Example 1: Create a .gz compressed file from a text file
file_to_compress = 'example.txt'
compressed_file = 'example.txt.gz'

if os.path.exists(file_to_compress):
    with open(file_to_compress, 'rb') as f_in:
        with gzip.open(compressed_file, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)
    print(f"Compressed {file_to_compress} to {compressed_file}")
else:
    print(f"File {file_to_compress} does not exist")

# Example 2: Extract a .gz compressed file
file_to_extract = 'example.txt.gz'
extracted_file = 'extracted_example.txt'

if os.path.exists(file_to_extract):
    with gzip.open(file_to_extract, mode='rb') as f_in:
        with open(extracted_file, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)
    print(f"Extracted {compressed_file} to {extracted_file}")
else:
    print(f"File {file_to_extract} does not exist")

7. Listing Files in a Directory

import shutil
import os

# Example 1: List all files and directories in the current directory
current_dir = '.'
files_and_dirs = os.listdir(current_dir)
print(f"Files and Directories in {current_dir}: {files_and_dirs}")

# Example 2: Recursively list all files in a directory (including subdirectories)
directory_to_list = 'example_directory'

for root, dirs, files in os.walk(directory_to_list):
    for file in files:
        print(os.path.join(root, file))

8. Getting File Information

import shutil
import os

# Example 1: Get the size of a file
file_path = 'example.txt'
try:
    size = os.path.getsize(file_path)
    print(f"Size of {file_path}: {size} bytes")
except FileNotFoundError:
    print(f"File {file_path} not found.")

# Example 2: Get information about the file like creation time, modification time, etc.
try:
    stat_info = os.stat(file_path)
    print(stat_info)
except FileNotFoundError:
    print(f"File {file_path} not found.")

9. Reading and Writing Files

import shutil
import os

# Example 1: Read a file into memory as a string
file_to_read = 'example.txt'
if os.path.exists(file_to_read):
    with open(file_to_read, 'r') as f:
        content = f.read()
    print(f"Content of {file_to_read}: {content}")
else:
    print(f"File {file_to_read} does not exist.")

# Example 2: Write text to a file
file_to_write = 'example_written.txt'
text_to_write = "Hello, World!"
with open(file_to_write, 'w') as f:
    f.write(text_to_write)
print(f"Wrote '{text_to_write}' to {file_to_write}")

10. Making and Removing Directories

import os
import shutil

# Example 1: Create a new directory
directory_name = 'new_directory'
os.makedirs(directory_name, exist_ok=True)
print(f"Created {directory_name}")

# Example 2: Remove an empty directory
empty_dir_to_remove = 'empty_directory'
shutil.rmtree(empty_dir_to_remove, ignore_errors=True)
print(f"Removed {empty_dir_to_remove}")

Notes:

These examples should provide a good starting point for using the shutil module in Python.

stat - Interpreting stat() results.md

stat - Interpreting stat() results

The stat module in Python provides a portable way of using operating system-dependent functionality like reading or writing to the file system, and it includes functions that return information about files and directories. This module is particularly useful for understanding file properties such as permissions, last modification times, and more.

Here are several code examples that demonstrate how to interpret stat() results:

Example 1: Basic Usage of stat()

import os

# Define the path to a file
file_path = 'example.txt'

# Get the stat information for the file
stat_info = os.stat(file_path)

# Extract and print some useful information
print(f"File size (bytes): {stat_info.st_size}")
print(f"Last modified time: {stat_info.st_mtime}")
print(f"Permissions: {oct(stat_info.st_mode)}")

Example 2: Using os.path.getmtime() for Modification Time

import os

# Define the path to a file
file_path = 'example.txt'

# Use getmtime() to get the last modification time of the file
modification_time = os.path.getmtime(file_path)

# Print the formatted modification time
print(f"Last modified time: {modification_time}")

Example 3: Extracting Permissions and Flags

import stat

# Define the path to a directory
dir_path = '/path/to/directory'

# Get the stat information for the directory
stat_info = os.stat(dir_path)

# Extract permissions and flags
permissions = stat_info.st_mode
flags = stat_info.st_flags

print(f"Permissions: {oct(permissions)}")
print(f"Flags: {hex(flags)}")

Example 4: Handling File Attributes with os.lstat() and os.fstat()

import os

# Define the path to a symbolic link and a file
symbolic_link_path = 'symlink.txt'
file_path = 'example.txt'

# Use lstat() to get stat information for a symbolic link
link_stat_info = os.lstat(symbolic_link_path)
print(f"Symbolic Link Stat Info: {link_stat_info.st_mode}")

# Use fstat() to get stat information for an open file descriptor
with open(file_path, 'r') as file:
    file_stat_info = os.fstat(file.fileno())
print(f"File Stat Info (from file descriptor): {file_stat_info.st_mode}")

Example 5: Checking File Types

import os

# Define the path to a file and directory
file_path = 'example.txt'
dir_path = '/path/to/directory'

# Get stat information for the file and directory
file_stat_info = os.stat(file_path)
dir_stat_info = os.stat(dir_path)

# Check if they are files or directories
is_file = stat.S_ISREG(file_stat_info.st_mode)
is_dir = stat.S_ISDIR(dir_stat_info.st_mode)

print(f"Is {file_path} a file? {'Yes' if is_file else 'No'}")
print(f"Is {dir_path} a directory? {'Yes' if is_dir else 'No'}")

Example 6: Accessing Extended Attributes with os.listxattr()

import os

# Define the path to a file or directory
path = '/path/to/file'

# List extended attributes of the object
try:
    xattrs = os.listxattr(path)
    print(f"Extended attributes for {path}: {', '.join(xattrs)}")
except OSError as e:
    print(f"Error listing extended attributes: {e}")

Example 7: Using os.access() to Check Permissions

import os

# Define the path to a file and permissions
file_path = 'example.txt'
permissions_to_check = os.R_OK | os.W_OK

# Use access() to check if the current user has the specified permissions
if os.access(file_path, permissions_to_check):
    print(f"Current user has read/write permission for {file_path}")
else:
    print(f"Current user does not have read/write permission for {file_path}")

Example 8: Retrieving Filesystem Information with os.statvfs()

import os

# Define the path to a directory
directory_path = '/path/to/directory'

# Get filesystem statistics for the directory
statvfs_info = os.statvfs(directory_path)

print(f"Total space: {statvfs_info.f_blocks * statvfs_info.f_frsize} bytes")
print(f"Free space: {statvfs_info.f_bfree * statvfs_info.f_frsize} bytes")
print(f"Available space: {statvfs_info.f_bavail * statvfs_info.f_frsize} bytes")

These examples demonstrate how to use the stat module in Python to retrieve and interpret various file system properties. Each example includes comments explaining the purpose of each step and relevant functions used.

tempfile - Generate temporary files and directories.md

tempfile - Generate temporary files and directories

The tempfile module in Python provides a set of functions to create temporary files and directories, which are useful for testing, configuration files, or any other scenarios where you need to manage small files that do not persist beyond the current session. Below are comprehensive code examples demonstrating various functionalities of the tempfile module:

1. Creating Temporary Files

import tempfile

def create_temp_file():
    # Create a temporary file and get its name
    with tempfile.NamedTemporaryFile() as temp_file:
        print(f"Created temp file: {temp_file.name}")

create_temp_file()

2. Creating Temporary Files with Specific Modes

import tempfile

def create_temp_file_with_mode():
    # Create a temporary file in write mode
    with tempfile.NamedTemporaryFile(mode='w+') as temp_file:
        temp_file.write("Hello, World!")
        temp_file.seek(0)  # Move the cursor to the beginning of the file
        print(f"Read from temp file: {temp_file.read()}")
        print(f"Created temp file: {temp_file.name}")

create_temp_file_with_mode()

3. Creating Temporary Files with Specific File Types

import tempfile

def create_temp_file_with_suffix():
    # Create a temporary file with a specific suffix
    with tempfile.NamedTemporaryFile(suffix=".txt") as temp_file:
        print(f"Created temp file: {temp_file.name}")

create_temp_file_with_suffix()

4. Creating Temporary Directories

import tempfile

def create_temp_directory():
    # Create a temporary directory and get its name
    with tempfile.TemporaryDirectory() as temp_dir:
        print(f"Created temp dir: {temp_dir}")

create_temp_directory()

5. Creating Temporary Directories with Specific Directory Types

import tempfile

def create_temp_directory_with_dir():
    # Create a temporary directory using an existing directory
    with tempfile.TemporaryDirectory(dir="/path/to/existing/directory") as temp_dir:
        print(f"Created temp dir: {temp_dir}")

create_temp_directory_with_dir()

6. Creating Temporary Directories with Specific Suffixes

import tempfile

def create_temp_directory_with_suffix():
    # Create a temporary directory with a specific suffix
    with tempfile.TemporaryDirectory(suffix=".tmp") as temp_dir:
        print(f"Created temp dir: {temp_dir}")

create_temp_directory_with_suffix()

7. Creating Temporary Files Using a NamedTemporaryFile Object

import tempfile

def create_temp_file_with_namedtemporaryfile():
    # Create a NamedTemporaryFile object
    temp_file = tempfile.NamedTemporaryFile()
    print(f"Created temp file: {temp_file.name}")

    # Manually manage the file using the file descriptor and path
    with open(temp_file.file, 'w+') as f:
        f.write("Hello, World!")
        f.seek(0)
        print(f"Read from temp file: {f.read()}")

# Note: The above approach is not recommended for general use due to resource management issues.

8. Creating Temporary Files with Specific Directory and Suffix

import tempfile

def create_temp_file_with_dir_and_suffix():
    # Create a temporary file in a specific directory with a specific suffix
    with tempfile.NamedTemporaryFile(dir="/path/to/existing/directory", suffix=".log") as temp_file:
        print(f"Created temp file: {temp_file.name}")

create_temp_file_with_dir_and_suffix()

These examples cover various aspects of using the tempfile module, from basic file creation to more advanced scenarios involving directories. The code is designed to be clear and easy to understand, with comments explaining each step for clarity.

File Formats

configparser - Configuration file parser.md

configparser - Configuration file parser

The configparser module in Python is used to read and write configuration files in a format similar to the Windows INI files but with more features. Below are comprehensive and well-documented examples of how to use various functionalities provided by this module.

1. Reading an INI File

import configparser

# Create a ConfigParser object
config = configparser.ConfigParser()

# Read the configuration file
config.read('example.ini')

# Access sections and values
print("Section:", config.sections())
for section in config.sections():
    print(f"Section: {section}")
    for key, value in config.items(section):
        print(f"{key}: {value}")

# Reading a specific value from a section
username = config.get('Database', 'user')
password = config.get('Database', 'password')
print("Username:", username)
print("Password:", password)

2. Writing to an INI File

import configparser

# Create a ConfigParser object
config = configparser.ConfigParser()

# Add sections and set values
config['Section1'] = {'key1': 'value1', 'key2': 'value2'}
config['Section2'] = {'key3': 'value3', 'key4': 'value4'}

# Write the configuration to a file
with open('example.ini', 'w') as configfile:
    config.write(configfile)

print("Configuration written to example.ini")

3. Handling Default Values

import configparser

# Create a ConfigParser object with default values
config = configparser.ConfigParser()
config['DEFAULT'] = {'timeout': '60'}
config['Database'] = {'user': 'admin', 'password': 'secret'}

# Read the configuration file (assuming it exists)
config.read('example.ini')

# Access default and specific values
default_timeout = config.getint('DEFAULT', 'timeout')
database_user = config.get('Database', 'user')
print("Default Timeout:", default_timeout)
print("Database User:", database_user)

# Writing the updated configuration with new defaults
config['DEFAULT'] = {'timeout': '120'}
with open('example.ini', 'w') as configfile:
    config.write(configfile)

print("Updated configuration written to example.ini")

4. Using Interpolation

import configparser

# Create a ConfigParser object with interpolation
config = configparser.ConfigParser()
config['Database'] = {'username': '${USERNAME}', 'password': '${PASSWORD}'}

# Example of setting environment variables for interpolation
import os
os.environ['USERNAME'] = 'user123'
os.environ['PASSWORD'] = 'pass456'

# Read the configuration file with interpolation
with open('example.ini', 'r') as configfile:
    config.read_file(configfile)

# Access values after interpolation
database_username = config.get('Database', 'username')
database_password = config.get('Database', 'password')

print("Interpolated Username:", database_username)
print("Interpolated Password:", database_password)

5. Handling Lists

import configparser

# Create a ConfigParser object with list values
config = configparser.ConfigParser()
config['Section'] = {'items': ['item1', 'item2', 'item3']}

# Read the configuration file
with open('example.ini', 'r') as configfile:
    config.read_file(configfile)

# Access list values
items = config.get('Section', 'items')
print("Items:", items.split(', '))  # Note: This assumes a comma-separated string

# Writing the updated configuration with list values
config['Section']['items'] = ['item1', 'updated-item2', 'item3']
with open('example.ini', 'w') as configfile:
    config.write(configfile)

print("Updated configuration written to example.ini")

6. Handling Sections

import configparser

# Create a ConfigParser object and add sections
config = configparser.ConfigParser()
config.add_section('Section1')
config['Section1']['key1'] = 'value1'
config.add_section('Section2')
config['Section2']['key2'] = 'value2'

# Read the configuration file (assuming it exists)
with open('example.ini', 'r') as configfile:
    config.read_file(configfile)

# Access all sections
all_sections = config.sections()
print("All Sections:", all_sections)

# Removing a section
config.remove_section('Section1')
print("After removing Section1:", config.sections())

# Writing the updated configuration without removed sections
with open('example.ini', 'w') as configfile:
    config.write(configfile)

print("Updated configuration written to example.ini")

7. Handling Comments

import configparser

# Create a ConfigParser object and add comments
config = configparser.ConfigParser()
config['Section'] = {'key1': 'value1'}
config.read('example.ini')

# Add a comment before a section
config.add_section('AnotherSection')
config['AnotherSection']['key2'] = 'value2'
config.set_comment('AnotherSection', 'This is a comment for AnotherSection.')

# Read the configuration file (assuming it exists)
with open('example.ini', 'r') as configfile:
    print(configfile.read())

print("Comments added to the configuration")

8. Handling Multiple Values in a Section

import configparser

# Create a ConfigParser object and add multiple values in a section
config = configparser.ConfigParser()
config['Section'] = {'key1': 'value1', 'key2': 'value2'}
config.set('Section', 'key3', 'value3')

# Read the configuration file (assuming it exists)
with open('example.ini', 'r') as configfile:
    print(configfile.read())

print("Multiple values in a section added to the configuration")

9. Handling Sections with Duplicate Keys

import configparser

# Create a ConfigParser object and add sections with duplicate keys
config = configparser.ConfigParser()
config['Section1'] = {'key': 'value1'}
config['Section2'] = {'key': 'value2'}

# Read the configuration file (assuming it exists)
with open('example.ini', 'r') as configfile:
    print(configfile.read())

print("Sections with duplicate keys added to the configuration")

These examples cover various aspects of using the configparser module, including reading and writing configurations, handling default values, interpolation, lists, sections, comments, and duplicate keys.

csv - CSV File Reading and Writing.md

csv - CSV File Reading and Writing

Below are comprehensive examples of how to read from and write to CSV files using the csv module in Python 3.12. Each example includes detailed comments explaining each step.

Example 1: Writing a CSV file

import csv

# Data to be written into a CSV file
data = [
    ['Name', 'Age', 'City'],
    ['Alice', 30, 'New York'],
    ['Bob', 25, 'Los Angeles'],
    ['Charlie', 35, 'Chicago']
]

# Define the filename for the CSV file
filename = 'output.csv'

# Open a file in write mode and create a CSV writer object
with open(filename, mode='w', newline='') as file:
    writer = csv.writer(file)

    # Write the header row
    writer.writerow(data[0])

    # Write the data rows starting from the second element of the list
    for row in data[1:]:
        writer.writerow(row)

# Print a confirmation message
print(f'Data has been written to {filename}')

Explanation:

Example 2: Reading a CSV file

import csv

# Define the filename for the CSV file
filename = 'input.csv'

# Open the file in read mode and create a CSV reader object
with open(filename, mode='r') as file:
    reader = csv.reader(file)

    # Read all rows from the CSV file
    rows = list(reader)

    # Print each row
    for row in rows:
        print(row)

# Print the total number of rows read
print(f'Total number of rows: {len(rows)}')

Explanation:

Example 3: Writing a CSV file with DictWriter

import csv

# Data to be written into a CSV file using DictWriter
data = [
    {'Name': 'Alice', 'Age': 30, 'City': 'New York'},
    {'Name': 'Bob', 'Age': 25, 'City': 'Los Angeles'},
    {'Name': 'Charlie', 'Age': 35, 'City': 'Chicago'}
]

# Define the filename for the CSV file
filename = 'output_dict.csv'

# Open a file in write mode and create a DictWriter object
with open(filename, mode='w', newline='') as file:
    fieldnames = ['Name', 'Age', 'City']  # Column names
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    # Write the header row
    writer.writeheader()

    # Write the data rows
    for row in data:
        writer.writerow(row)

# Print a confirmation message
print(f'Data has been written to {filename}')

Explanation:

Example 4: Reading a CSV file with DictReader

import csv

# Define the filename for the CSV file
filename = 'input_dict.csv'

# Open the file in read mode and create a DictReader object
with open(filename, mode='r') as file:
    reader = csv.DictReader(file)

    # Read all rows from the CSV file
    rows = list(reader)

    # Print each row
    for row in rows:
        print(row)

# Print the total number of rows read
print(f'Total number of rows: {len(rows)}')

Explanation:

These examples cover basic operations for reading from and writing to CSV files using Python's csv module. You can expand upon these examples by handling different types of data, such as complex numbers or custom objects, by implementing appropriate serialization and deserialization logic.

netrc - netrc file processing.md

netrc - netrc file processing

The netrc module in Python provides an interface to read and write .netrc files, which are commonly used by applications that require network access, such as FTP clients, email clients, and web browsers. This module allows you to manage credentials securely across different network services.

Below are comprehensive examples for various functionalities of the netrc module:

# Import the netrc module
import netrc

def example_1_read_netrc():
    """
    Example 1: Reading a .netrc file and accessing credentials.

    This function reads the user's default `.netrc` file and prints out the username, password,
    and machine for each entry.
    """
    try:
        # Create a NetRC object to read the .netrc file
        n = netrc.netrc()

        # Iterate over all hosts in the .netrc file
        for host, auth_info in n.hosts.items():
            print(f"Host: {host}")
            print(f"Username: {auth_info.login}")
            print(f"Password: {auth_info.password}")
            if auth_info.account:
                print(f"Account: {auth_info.account}")
            print('-' * 40)
    except FileNotFoundError:
        print("No .netrc file found.")
    except netrc.NetrcParseError as e:
        print(f"Error parsing .netrc file: {e}")

def example_2_write_netrc():
    """
    Example 2: Writing to a .netrc file.

    This function writes new entries to the user's default `.netrc` file for a specific host.
    """
    try:
        # Create a NetRC object to write to the .netrc file
        n = netrc.netrc()

        # Add a new entry for a specific host
        n.add('example.com', 'username', 'password')

        # Write the changes to the .netrc file
        with open(n.netrc_file, 'w') as f:
            f.write(str(n))

        print("Entry added to .netrc file successfully.")
    except Exception as e:
        print(f"Error writing to .netrc file: {e}")

def example_3_update_netrc():
    """
    Example 3: Updating an existing entry in a .netrc file.

    This function updates the password for an existing host in the user's default `.netrc` file.
    """
    try:
        # Create a NetRC object to update the .netrc file
        n = netrc.netrc()

        # Update an existing entry for a specific host
        n.update('example.com', 'username', new_password='newpassword')

        # Write the changes to the .netrc file
        with open(n.netrc_file, 'w') as f:
            f.write(str(n))

        print("Entry updated in .netrc file successfully.")
    except Exception as e:
        print(f"Error updating .netrc file: {e}")

def example_4_remove_netrc():
    """
    Example 4: Removing an entry from a .netrc file.

    This function removes an entry for a specific host from the user's default `.netrc` file.
    """
    try:
        # Create a NetRC object to remove the entry
        n = netrc.netrc()

        # Remove an existing entry for a specific host
        n.remove('example.com')

        # Write the changes to the .netrc file
        with open(n.netrc_file, 'w') as f:
            f.write(str(n))

        print("Entry removed from .netrc file successfully.")
    except Exception as e:
        print(f"Error removing entry from .netrc file: {e}")

def example_5_error_handling():
    """
    Example 5: Handling errors gracefully.

    This function demonstrates how to handle potential errors that might occur when reading,
    writing, updating, or removing entries from the `.netrc` file.
    """
    try:
        # Attempt to read a non-existent .netrc file
        n = netrc.netrc('nonexistent_file')
        print("This line will not be executed due to FileNotFoundError.")
    except FileNotFoundError as e:
        print(f"No .netrc file found: {e}")

    try:
        # Attempt to update a non-existing host in the default .netrc file
        n = netrc.netrc()
        n.update('nonexistent_host', 'username', 'password')
        with open(n.netrc_file, 'w') as f:
            f.write(str(n))
        print("This line will not be executed due to NetrcParseError.")
    except netrc.NetrcParseError as e:
        print(f"Error parsing .netrc file: {e}")

if __name__ == "__main__":
    example_1_read_netrc()
    example_2_write_netrc()
    example_3_update_netrc()
    example_4_remove_netrc()
    example_5_error_handling()

Explanation:

These examples provide a comprehensive overview of how to use the netrc module in Python, covering reading, writing, updating, and removing entries from the .netrc file.

plistlib - Generate and parse Apple .plist files.md

plistlib - Generate and parse Apple .plist files

The plistlib module in Python is used to read from and write to Apple Property List (.plist) files, which are a common data storage format used by macOS. Below are comprehensive code examples that demonstrate how to use the plistlib module to generate and parse .plist files.

Example 1: Writing a Simple Plist

import plistlib

# Create a dictionary
data = {
    "Name": "John Doe",
    "Age": 30,
    "IsEmployed": True,
    "Address": {
        "Street": "123 Elm St",
        "City": "Anytown"
    },
    "Phones": [
        {"Type": "Home", "Number": "555-1234"},
        {"Type": "Work", "Number": "555-5678"}
    ]
}

# Write the dictionary to a .plist file
with open('example.plist', 'wb') as f:
    plistlib.dump(data, f)

print("Plist has been written to example.plist")

Example 2: Parsing a Plist

import plistlib

# Read a .plist file and parse it into a dictionary
with open('example.plist', 'rb') as f:
    data = plistlib.load(f)

# Print the parsed data
print("Parsed Data:")
print(data)

Example 3: Writing a Plist with DateTime Objects

import plistlib
from datetime import datetime

# Create a dictionary with a date-time object
data = {
    "EventDate": datetime.now(),
    "Description": "This is an example event."
}

# Write the dictionary to a .plist file
with open('event.plist', 'wb') as f:
    plistlib.dump(data, f)

print("Plist has been written to event.plist")

Example 4: Parsing a Plist with DateTime Objects

import plistlib
from datetime import datetime

# Read a .plist file and parse it into a dictionary
with open('event.plist', 'rb') as f:
    data = plistlib.load(f)

# Extract and print the date-time object
event_date = data.get('EventDate')
if event_date:
    print("Event Date:", event_date)
else:
    print("Event Date not found.")

Example 5: Writing a Plist with Nested Lists

import plistlib

# Create a dictionary with nested lists
data = {
    "Tasks": [
        {"Name": "Complete report", "DueDate": datetime.now() + timedelta(days=7)},
        {"Name": "Read a book", "DueDate": datetime.now() + timedelta(days=3)}
    ]
}

# Write the dictionary to a .plist file
with open('tasks.plist', 'wb') as f:
    plistlib.dump(data, f)

print("Plist has been written to tasks.plist")

Example 6: Parsing a Plist with Nested Lists

import plistlib
from datetime import datetime

# Read a .plist file and parse it into a dictionary
with open('tasks.plist', 'rb') as f:
    data = plistlib.load(f)

# Extract and print the tasks list
tasks = data.get('Tasks')
if tasks:
    for task in tasks:
        print("Task Name:", task.get('Name'))
        print("Due Date:", task.get('DueDate'))
else:
    print("Tasks not found.")

Example 7: Writing a Plist with Custom Objects

If you need to handle custom objects, plistlib can be extended by using the DataHandler class. Hereโ€™s an example of how to define and use a custom handler for a specific type:

import plistlib

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def person_to_plist(person):
    return {
        '_type': 'Person',
        'name': person.name,
        'age': person.age
    }

def person_from_plist(data):
    if data['_type'] != 'Person':
        raise ValueError("Invalid data type")
    return Person(data['name'], data['age'])

# Create a list of custom objects
people = [Person('Alice', 30), Person('Bob', 25)]

# Define a custom handler for the Person class
handler = plistlib.DataHandler(person_to_plist, person_from_plist)

# Write the list of custom objects to a .plist file using the custom handler
with open('people.plist', 'wb') as f:
    plistlib.dump(people, f, data_handler=handler)

print("Plist has been written to people.plist")

Example 8: Parsing a Plist with Custom Objects

import plistlib

# Define the custom handler for the Person class
def person_to_plist(person):
    return {
        '_type': 'Person',
        'name': person.name,
        'age': person.age
    }

def person_from_plist(data):
    if data['_type'] != 'Person':
        raise ValueError("Invalid data type")
    return Person(data['name'], data['age'])

# Read a .plist file and parse it into a list of custom objects using the custom handler
with open('people.plist', 'rb') as f:
    people = plistlib.load(f, data_handler=handler)

# Print the parsed persons
for person in people:
    print("Person Name:", person.name)
    print("Person Age:", person.age)

These examples cover various aspects of using plistlib, from basic dictionary operations to handling custom objects and date-time objects. The code is designed to be clear, well-documented, and suitable for inclusion in official documentation.

tomllib - Parse TOML files.md

tomllib - Parse TOML files

Below are comprehensive examples of using the tomllib module from the Python standard library to parse TOML files. Each example is well-documented with comments explaining each step.

import tomllib

def parse_toml_file(file_path):
    """
    Parses a TOML file and returns a dictionary representing the parsed data.

    Parameters:
    - file_path (str): The path to the TOML file to be parsed.

    Returns:
    - dict: A dictionary containing the parsed data from the TOML file.
    """
    try:
        # Open the TOML file in binary mode
        with open(file_path, 'rb') as file:
            # Parse the TOML content using tomllib.load()
            data = tomllib.load(file)

        return data

    except FileNotFoundError:
        print(f"Error: The file '{file_path}' was not found.")
        return None

    except Exception as e:
        print(f"An error occurred while parsing the file: {e}")
        return None

def main():
    """
    Main function to demonstrate usage of parse_toml_file function.
    """
    # Path to the TOML file
    toml_file_path = 'example.toml'

    # Parse the TOML file and store the result in a variable
    parsed_data = parse_toml_file(toml_file_path)

    # Check if parsing was successful
    if parsed_data is not None:
        # Print the parsed data
        print("Parsed TOML Data:")
        print(parsed_data)

if __name__ == "__main__":
    main()

Explanation of Examples

  1. parse_toml_file Function:
  2. This function takes a file path as an argument and attempts to open and parse the TOML file using tomllib.load().
  3. The file is opened in binary mode ('rb') because TOML files are encoded in UTF-8, which can include byte sequences not representable by ASCII characters.
  4. If the file is successfully parsed, the function returns a dictionary containing the parsed data.
  5. Error handling is included to catch FileNotFoundError and any other exceptions that might occur during parsing.

  6. main Function:

  7. The main function demonstrates how to use the parse_toml_file function.
  8. It specifies the path to a TOML file (example.toml) and calls parse_toml_file with this path.
  9. If parsing is successful, it prints the parsed data.

Example TOML File (example.toml)

For demonstration purposes, here's an example of what your TOML file might look like:

# example.toml

[settings]
name = "John Doe"
age = 30
email = "john.doe@example.com"

[contacts]
work = { phone = "+1-555-1234", email = "johndoe@work.com" }
personal = { phone = "+1-555-5678", email = "johndoe@personal.com" }

# Array of items
fruits = ["apple", "banana", "cherry"]

# Nested tables
[settings.metadata]
created_at = 2023-10-01T14:30:00Z
updated_at = 2023-10-05T16:45:00Z

[groups]
employees = ["Alice", "Bob"]
managers = ["Charlie"]

Usage in Documentation

This code can be used as a starting point for integrating TOML parsing into larger Python applications. It provides a robust and error-handled way to parse TOML files, which is useful for configuration management or reading data from external sources that use TOML format.

By following the provided examples, developers can effectively utilize the tomllib module to handle TOML files in their projects.

Functional Programming Modules

functools - Higher-order functions and operations on callable objects.md

functools - Higher-order functions and operations on callable objects

The functools module in Python provides a collection of higher-order functions that can be used to work with callable objects, such as functions, methods, and other functions. These functions are particularly useful for optimizing or managing common patterns of code execution.

Here are some comprehensive code examples demonstrating various functionalities provided by the functools module:

  1. lru_cache: This decorator is used to cache the results of expensive function calls and reuse them when the same inputs occur again. It is especially useful in scenarios where a function calls itself recursively or repeatedly with the same arguments.
from functools import lru_cache

@lru_cache(maxsize=128)  # Cache up to 128 results
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

# Example usage
print(factorial(5))  # Output: 120
print(factorial(5))  # Reuses cached result, no additional computation needed
  1. partial: This function creates a new callable from an existing callable and some fixed arguments.
from functools import partial

def multiply(x, y):
    return x * y

# Create a new function that multiplies by 5
multiply_by_5 = partial(multiply, 5)

# Example usage
print(multiply_by_5(4))  # Output: 20
  1. reduce: This function applies a binary function cumulatively to the items of an iterable, from left to right, so as to reduce the iterable to a single output.
from functools import reduce

numbers = [1, 2, 3, 4, 5]

# Calculate the product of all numbers in the list
product = reduce(lambda x, y: x * y, numbers)
print(product)  # Output: 120
  1. cmp_to_key: This function converts a cmp callable to a key function for use with sorting functions.
from functools import cmp_to_key

def compare(x, y):
    if x > y:
        return 1
    elif x < y:
        return -1
    else:
        return 0

# Create a key function using cmp_to_key
key_function = cmp_to_key(compare)

# Example usage with sorted
sorted_list = sorted([3, 1, 4, 1, 5, 9], key=key_function)
print(sorted_list)  # Output: [1, 1, 3, 4, 5, 9]
  1. total_ordering: This class decorator can be used to automatically implement rich comparison operations (__eq__, __ne__, __lt__, __le__, __gt__, and __ge__) based on the implementations of some of them.
from functools import total_ordering

@total_ordering
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        if not isinstance(other, Point):
            return NotImplemented
        return (self.x == other.x) and (self.y == other.y)

    def __lt__(self, other):
        if not isinstance(other, Point):
            return NotImplemented
        return (self.x, self.y) < (other.x, other.y)

# Example usage
point1 = Point(1, 2)
point2 = Point(1, 3)
print(point1 == point2)  # Output: True
print(point1 < point2)   # Output: False
  1. reduce with operator.add: Using the reduce function along with the operator.add function, you can sum all elements in an iterable.
import operator

numbers = [1, 2, 3, 4, 5]

# Calculate the sum of all numbers in the list
total_sum = reduce(operator.add, numbers)
print(total_sum)  # Output: 15
  1. reduce with operator.mul: Similarly, you can use operator.mul to multiply all elements in an iterable.
import operator

numbers = [1, 2, 3, 4, 5]

# Calculate the product of all numbers in the list
total_product = reduce(operator.mul, numbers)
print(total_product)  # Output: 120
  1. reduce with operator.add and a custom lambda: Using a lambda function can also be used to perform operations on iterable elements.
import operator

numbers = [1, 2, 3, 4, 5]

# Calculate the sum of all numbers in the list using a lambda
total_sum_lambda = reduce(lambda x, y: x + y, numbers)
print(total_sum_lambda)  # Output: 15
  1. reduce with operator.mul and a custom lambda: Similarly, you can use a lambda function to multiply all elements in an iterable.
import operator

numbers = [1, 2, 3, 4, 5]

# Calculate the product of all numbers in the list using a lambda
total_product_lambda = reduce(lambda x, y: x * y, numbers)
print(total_product_lambda)  # Output: 120

These examples demonstrate various ways to use the functools module to enhance and optimize Python code. Each example includes comments that explain its purpose and functionality, making it easier for users to understand how these functions can be applied in different scenarios.

itertools - Functions creating iterators for efficient looping.md

itertools - Functions creating iterators for efficient looping

Certainly! Below are comprehensive code examples for each function in the itertools module, along with comments explaining each step:

import itertools

# 1. accumulate(iterable[, func])
# Returns an iterator that returns accumulated sums or results of a binary function.

numbers = [1, 2, 3, 4]
sum_iterator = itertools.accumulate(numbers)
print(list(sum_iterator))  # Output: [1, 3, 6, 10]

from operator import mul
product_iterator = itertools.accumulate(numbers, mul)
print(list(product_iterator))  # Output: [1, 2, 6, 24]


# 2. chain(*iterables)
# Returns a single iterable that concatenates the input iterables.

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
chain_iterator = itertools.chain(list1, list2)
print(list(chain_iterator))  # Output: [1, 2, 3, 'a', 'b', 'c']


# 3. combinations(iterable, r)
# Returns an iterator that yields all possible combinations of the input iterable taken r at a time.

elements = ['A', 'B', 'C']
combinations_of_2 = itertools.combinations(elements, 2)
print(list(combinations_of_2))  # Output: [('A', 'B'), ('A', 'C'), ('B', 'C')]


# 4. combinations_with_replacement(iterable, r)
# Returns an iterator that yields all possible combinations of the input iterable taken r at a time,
# with replacement.

combinations_with_replacement_of_2 = itertools.combinations_with_replacement(elements, 2)
print(list(combinations_with_replacement_of_2))  # Output: [('A', 'A'), ('A', 'B'), ('A', 'C'), 
                                                  #       ('B', 'B'), ('B', 'C'), ('C', 'C')]


# 5. combinations(iterable, r)
# Returns an iterator that yields all possible permutations of the input iterable taken r at a time.

permutations_of_2 = itertools.permutations(elements, 2)
print(list(permutations_of_2))  # Output: [('A', 'B'), ('A', 'C'), ('A', 'B'), ('B', 'A'), 
                                      #       ('B', 'C'), ('C', 'A')]


# 6. cycle(iterable)
# Returns an iterator that endlessly repeats the items from the input iterable.

repeating_iterator = itertools.cycle(elements)
for _ in range(10):
    print(next(repeating_iterator))  # Output will repeat 'A', 'B', 'C' in sequence


# 7. combinations_with_replacement(iterable, r)
# Returns an iterator that yields all possible permutations of the input iterable taken r at a time,
# with replacement.

permutations_with_replacement_of_3 = itertools.permutations(elements, 3)
print(list(permutations_with_replacement_of_3))  # Output: [('A', 'B', 'C'), ('A', 'C', 'A'), 
                                                  #       ('A', 'C', 'B'), ('B', 'A', 'C'),
                                                  #       ('B', 'C', 'A'), ('B', 'C', 'B'),
                                                  #       ('C', 'A', 'B'), ('C', 'B', 'A'),
                                                  #       ('C', 'B', 'C')]


# 8. count(start=0, step=1)
# Returns an iterator that counts from start with the specified step size.

count_iterator = itertools.count(5, 2)
print(list(next(count_iterator) for _ in range(5)))  # Output: [5, 7, 9, 11, 13]


# 9. dropwhile(predicate, iterable)
# Returns an iterator that drops elements from the input iterable as long as the predicate is true,
# then yields remaining elements.

non_zero_elements = [0, 1, 2, 3]
drop_iterator = itertools.dropwhile(lambda x: x == 0, non_zero_elements)
print(list(drop_iterator))  # Output: [1, 2, 3]


# 10. filterfalse(predicate, iterable)
# Returns an iterator that filters out elements from the input iterable for which the predicate is true.

odd_numbers = [1, 2, 3, 4]
filtered_iterator = itertools.filterfalse(lambda x: x % 2 == 0, odd_numbers)
print(list(filtered_iterator))  # Output: [1, 3]


# 11. groupby(iterable[, key])
# Returns an iterator that groups elements of the input iterable based on a specified key.

students = [('Alice', 'A'), ('Bob', 'B'), ('Charlie', 'A'), ('David', 'C')]
for group_key, group in itertools.groupby(students):
    print(f"{group_key}: {list(group)}")
# Output:
# A: [('Alice', 'A'), ('Charlie', 'A')]
# B: [('Bob', 'B')]
# C: [('David', 'C')]


# 12. islice(iterable, stop)
# Returns an iterator that returns selected elements from the input iterable up to a specified count.

sliced_iterator = itertools.islice(range(10), 5)
print(list(sliced_iterator))  # Output: [0, 1, 2, 3, 4]


# 13. permutations(iterable, r=None)
# Returns an iterator that yields all possible permutations of the input iterable taken r at a time.
# If r is not specified, defaults to the length of the iterable.

permutations_of_all_elements = itertools.permutations(elements)
print(list(permutations_of_all_elements))  # Output: [('A', 'B'), ('A', 'C'), ('B', 'A'),
                                                  #       ('B', 'C'), ('C', 'A')]


# 14. product(*iterables, repeat=1)
# Returns an iterator that produces the Cartesian product of input iterables.

elements = ['a', 'b']
repeated_product_iterator = itertools.product(elements, repeat=2)
print(list(repeated_product_iterator))  # Output: [('a', 'a'), ('a', 'b'), ('b', 'a'), ('b', 'b')]


# 15. starmap(function, iterable)
# Returns an iterator that applies the specified function to corresponding elements from each input iterable.

numbers = [1, 2, 3]
squared_numbers = itertools.starmap(pow, [(x, 2) for x in numbers])
print(list(squared_numbers))  # Output: [1, 4, 9]


# 16. tee(iterable, n=2)
# Returns n independent iterators from a single iterable.

original_iterator = range(5)
iterator1, iterator2 = itertools.tee(original_iterator)

for i in iterator1:
    print(i)  # Output: 0, 1, 2, 3, 4

for i in iterator2:
    print(i)  # Output: 0, 1, 2, 3, 4


# 17. takewhile(predicate, iterable)
# Returns an iterator that yields elements from the input iterable as long as the predicate is true,
# then stops.

positive_numbers = [1, -2, 3, -4]
takewhile_iterator = itertools.takewhile(lambda x: x > 0, positive_numbers)
print(list(takewhile_iterator))  # Output: [1, 3]


# 18. zip_longest(*iterables, fillvalue=None)
# Returns an iterator that aggregates elements from each of the input iterables into tuples.

list1 = [1, 2]
list2 = ['a', 'b', 'c']
zipped_iterator = itertools.zip_longest(list1, list2, fillvalue='X')
print(list(zipped_iterator))  # Output: [(1, 'a'), (2, 'b'), ('X', 'c')]


# 19. chain.from_iterable(iterables)
# Similar to itertools.chain(), but takes an iterable of iterables instead.

list_of_lists = [[1, 2], [3, 4]]
chained_iterator = itertools.chain.from_iterable(list_of_lists)
print(list(chained_iterator))  # Output: [1, 2, 3, 4]


# 20. permutations(iterable, r=None)
# Returns an iterator that yields all possible permutations of the input iterable taken r at a time.
# If r is not specified, defaults to the length of the iterable.

permutations_of_all_elements = itertools.permutations(elements)
print(list(permutations_of_all_elements))  # Output: [('A', 'B'), ('A', 'C'), ('B', 'A'),
                                                  #       ('B', 'C'), ('C', 'A')]

These examples cover a wide range of functionalities provided by the itertools module, demonstrating how to use each function effectively in Python.

operator - Standard operators as functions.md

operator - Standard operators as functions

The operator module in Python provides a convenient way to access operators as functions, which can be very useful for performing arithmetic operations, comparisons, and other operations in a more functional style. Below are comprehensive code examples for each functionality provided by the operator module.

1. Arithmetic Operations

import operator

# Addition
result = operator.add(2, 3)
print("Addition:", result)  # Output: Addition: 5

# Subtraction
result = operator.sub(2, 3)
print("Subtraction:", result)  # Output: Subtraction: -1

# Multiplication
result = operator.mul(2, 3)
print("Multiplication:", result)  # Output: Multiplication: 6

# Division (floating-point division)
result = operator.truediv(5, 2)
print("Division (float):", result)  # Output: Division (float): 2.5

# Floor Division
result = operator.floordiv(5, 2)
print("Floor Division:", result)  # Output: Floor Division: 2

# Modulus
result = operator.mod(7, 3)
print("Modulus:", result)  # Output: Modulus: 1

# Exponentiation
result = operator.pow(2, 3)
print("Exponentiation:", result)  # Output: Exponentiation: 8

2. Comparison Operations

import operator

# Equal to
result = operator.eq(5, 5)
print("Equal to:", result)  # Output: Equal to: True

# Not equal to
result = operator.ne(5, 5)
print("Not equal to:", result)  # Output: Not equal to: False

# Less than
result = operator.lt(3, 5)
print("Less than:", result)  # Output: Less than: True

# Greater than
result = operator.gt(5, 3)
print("Greater than:", result)  # Output: Greater than: True

# Less than or equal to
result = operator.le(5, 5)
print("Less than or equal to:", result)  # Output: Less than or equal to: True

# Greater than or equal to
result = operator.ge(5, 3)
print("Greater than or equal to:", result)  # Output: Greater than or equal to: True

3. Logical Operations

import operator

# And
result = operator.and_(True, False)
print("And:", result)  # Output: And: False

# Or
result = operator.or_(True, False)
print("Or:", result)  # Output: Or: True

# Xor (exclusive or)
result = operator.xor(True, False)
print("Xor:", result)  # Output: Xor: True

# Not
result = operator.not_(True)
print("Not:", result)  # Output: Not: False

4. Identity and Membership Operations

import operator

# Identity check (is)
a = [1, 2, 3]
b = [1, 2, 3]
c = [4, 5, 6]

result = operator.is_(a, b)
print("Identity check (is):", result)  # Output: Identity check (is): True

result = operator.is_not(a, c)
print("Identity check (is not):", result)  # Output: Identity check (is not): True

# Membership check in
result = operator.contains([1, 2, 3], 2)
print("Membership check in:", result)  # Output: Membership check in: True

result = operator.contains([1, 2, 3], 4)
print("Membership check in:", result)  # Output: Membership check in: False

5. Function and Method Calls

import operator

def add(a, b):
    return a + b

# Call using operator.methodcaller
result = operator.methodcaller('add', 2, 3)(4)
print("Function call:", result)  # Output: Function call: 9

# Call using operator.methodcaller with multiple arguments
result = operator.methodcaller('split', 'hello world')([' ', '.'])
print("Method call (split):", result)  # Output: Method call (split): ['hello', 'world']

6. Attribute Access and Item Retrieval

import operator

class MyClass:
    def __init__(self, value):
        self.value = value

# Attribute access using operator.attrgetter
obj = MyClass(10)
result = operator.attrgetter('value')(obj)
print("Attribute access:", result)  # Output: Attribute access: 10

# Item retrieval using operator.itemgetter
my_list = [1, 2, 3]
result = operator.itemgetter(1)(my_list)
print("Item retrieval:", result)  # Output: Item retrieval: 2

7. Callable Objects

import operator

class MyCallable:
    def __call__(self, x):
        return x * 2

# Callable object usage with operator.methodcaller
callable_obj = MyCallable()
result = operator.methodcaller('__call__', 3)(callable_obj)
print("Callable object:", result)  # Output: Callable object: 6

8. Operator Lookup

import operator

# Look up an operator by its name
add_operator = operator.getattr(operator, 'add')
result = add_operator(2, 3)
print("Operator lookup:", result)  # Output: Operator lookup: 5

These examples demonstrate the various functionalities provided by the operator module, covering arithmetic, comparison, logical, identity and membership checks, function and method calls, attribute access, item retrieval, callable objects, and operator lookup. Each example is clear, concise, and includes comments to explain each step for better understanding.

Generic Operating System Services

argparse - Parser for command-line options, arguments and subcommands.md

argparse - Parser for command-line options, arguments and subcommands

The argparse module in Python is a powerful tool for parsing command-line arguments and providing usage information to users. It allows you to create user-friendly interfaces that are easy to use and understand, while also enabling robust error handling and help output.

Below are comprehensive code examples for various functionalities within the argparse module, including setting up argument parsers, defining options, handling subcommands, and displaying usage information.

Example 1: Basic Argument Parsing

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a basic command-line parser')

# Add arguments to the parser
parser.add_argument('--name', type=str, help='Your name')
parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode (prints additional information)')

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed arguments
print(f'Hello {args.name}')
if args.verbose:
    print('Verbose mode is enabled.')

Example 2: Argument Parsing with Subcommands

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with subcommands')

# Add subparsers
subparsers = parser.add_subparsers(dest='command', help='Sub-command help')

# Define the first subcommand
parser_add = subparsers.add_parser('add', help='Add two numbers')
parser_add.add_argument('a', type=float, help='First number to add')
parser_add.add_argument('b', type=float, help='Second number to add')

# Define the second subcommand
parser_mult = subparsers.add_parser('mult', help='Multiply two numbers')
parser_mult.add_argument('a', type=float, help='First number to multiply')
parser_mult.add_argument('b', type=float, help='Second number to multiply')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed subcommand and perform operations
if args.command == 'add':
    result = args.a + args.b
    print(f'The sum is {result}')
elif args.command == 'mult':
    result = args.a * args.b
    print(f'The product is {result}')

Example 3: Argument Parsing with Options

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with options')

# Add options to the parser
parser.add_argument('--input', type=str, required=True, help='Input file path')
parser.add_argument('--output', type=str, default='output.txt', help='Output file path (default: output.txt)')
parser.add_argument('-f', '--force', action='store_true', help='Force overwriting the output file if it already exists')

# Parse the command-line arguments
args = parser.parse_args()

# Process the parsed options
print(f'Input File: {args.input}')
print(f'Output File: {args.output}')
if args.force:
    print('Forcing overwrite of output file.')

Example 4: Argument Parsing with Custom Help Messages

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with custom help messages')

# Add arguments to the parser
parser.add_argument('--name', type=str, required=True, help='Your name (mandatory)')
parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode (optional)')

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed arguments and custom messages
print(f'Hello {args.name}!')
if args.verbose:
    print('Verbose mode is enabled.')
else:
    print('Verbose mode is disabled.')

Example 5: Argument Parsing with Default Values

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values')

# Add arguments to the parser with default values
parser.add_argument('--threshold', type=float, default=10.0, help='Threshold value (default: 10.0)')
parser.add_argument('--debug', action='store_true', help='Enable debug mode')

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed arguments and default values
print(f'Threshold Value: {args.threshold}')
if args.debug:
    print('Debug mode is enabled.')
else:
    print('Debug mode is disabled.')

Example 6: Argument Parsing with Required Arguments

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with required arguments')

# Add arguments to the parser as required
parser.add_argument('--username', type=str, help='Your username (required)')
parser.add_argument('--password', type=str, help='Your password (required)')

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed arguments
print(f'Username: {args.username}')
print(f'Password: {args.password}')

Example 7: Argument Parsing with Error Handling

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with error handling')

# Add an argument to the parser
parser.add_argument('--count', type=int, help='Number of times to repeat (default: 1)')

# Parse the command-line arguments
args = parser.parse_args()

try:
    for _ in range(args.count):
        print('Repeat')
except TypeError as e:
    parser.error(f'Invalid count value: {e}')

Example 8: Argument Parsing with Descriptive Help Output

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with descriptive help output')

# Add arguments to the parser
parser.add_argument('--input', type=str, required=True, help='Input file path (mandatory)')
parser.add_argument('--output', type=str, default='output.txt', help='Output file path (default: output.txt)')

# Display usage information
print(parser.format_help())

Example 9: Argument Parsing with Subparsers and Aliases

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with subcommands and aliases')

# Add subparsers with aliases
subparsers = parser.add_subparsers(dest='command', help='Sub-command help')

# Define the first subcommand with alias
parser_add = subparsers.add_parser('add', help='Add two numbers', aliases=['sum'])
parser_add.add_argument('a', type=float, help='First number to add')
parser_add.add_argument('b', type=float, help='Second number to add')

# Define the second subcommand with alias
parser_mult = subparsers.add_parser('mult', help='Multiply two numbers', aliases=['product'])
parser_mult.add_argument('a', type=float, help='First number to multiply')
parser_mult.add_argument('b', type=float, help='Second number to multiply')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed subcommand and perform operations
if args.command == 'add' or args.command == 'sum':
    result = args.a + args.b
    print(f'The sum is {result}')
elif args.command == 'mult' or args.command == 'product':
    result = args.a * args.b
    print(f'The product is {result}')

Example 10: Argument Parsing with Custom Type Conversion

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with custom type conversion')

# Define a custom function for converting string to float
def convert_to_float(value):
    try:
        return float(value)
    except ValueError as e:
        raise argparse.ArgumentTypeError(f'Invalid number: {value}. Must be a valid float.')

# Add an argument with custom type conversion
parser.add_argument('--number', type=convert_to_float, help='Number to process')

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed argument after conversion
print(f'The processed number is {args.number}')

Example 11: Argument Parsing with Nested Subcommands

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with nested subcommands')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand
subcmd1 = main_subparsers.add_parser('cmd1', help='Sub-command 1')
subcmd1.add_argument('--option', type=str, help='Option for sub-command 1')

# Define the second subcommand
subcmd2 = main_subparsers.add_parser('cmd2', help='Sub-command 2')
subcmd2.add_argument('--arg', type=int, help='Argument for sub-command 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed subcommands and their arguments
if args.main_command == 'cmd1':
    print(f'Option: {args.option}')
elif args.main_command == 'cmd2':
    print(f'Argument: {args.arg}')

Example 12: Argument Parsing with Custom Help Formatter

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with custom help formatter')

# Add arguments to the parser
parser.add_argument('--input', type=str, required=True, help='Input file path (mandatory)')
parser.add_argument('--output', type=str, default='output.txt', help='Output file path (default: output.txt)')

# Create a custom help formatter class
class CustomHelpFormatter(argparse.HelpFormatter):
    def _format_usage(self, usage, actions, groups, prefix=''):
        lines = self._split_lines(usage)
        # Customize the help format here
        return '\n'.join(lines)

# Set the custom help formatter
parser.formatter_class = CustomHelpFormatter

# Display usage information with custom formatting
print(parser.format_help())

Example 13: Argument Parsing with Default Values and Aliases

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases')

# Add arguments to the parser with default values and aliases
parser.add_argument('--option', type=str, help='Option with default value (default: default_value)', default='default_value')
parser.add_argument('--alias-option', type=str, help='Alias for option', alias=['aopt'])

# Parse the command-line arguments
args = parser.parse_args()

# Print the parsed arguments
print(f'Option: {args.option}')
print(f'Alias Option: {args.alias_option}')

Example 14: Argument Parsing with Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1')
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2')
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 15: Argument Parsing with Help Callbacks

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with help callbacks')

# Add arguments to the parser
parser.add_argument('--option', type=str, help='Option with callback function')

# Define a callback function for the help option
def on_help(args):
    print('This is a custom help message.')
    parser.print_usage()

# Set the help callback for the help option
parser.set_defaults(on_help=on_help)

# Parse the command-line arguments
args = parser.parse_args()

# Check if the help option was used and execute the callback
if hasattr(args, 'on_help'):
    args.on_help()

Example 16: Argument Parsing with Default Values for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)')
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)')
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 17: Argument Parsing with Custom Help Text for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with custom help text for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with custom help text
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1\nThis flag enables feature X.')
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1\nThis flag enables feature Y.')

# Define the second subcommand group with custom help text
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2\nThis flag enables feature Z.')
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with custom help text
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 18: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 19: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 20: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 21: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 22: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 23: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 24: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 25: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 26: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 27: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 28: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 29: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

Example 30: Argument Parsing with Default Values and Aliases for Mutually Exclusive Groups

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Example of a command-line parser with default values and aliases for mutually exclusive groups')

# Add subparsers for the main command
main_subparsers = parser.add_subparsers(dest='main_command', help='Main command help')

# Define the first subcommand group with default value and alias
group1 = main_subparsers.add_argument_group('Group 1')
group1.add_argument('--flag1', action='store_true', help='Flag 1 in Group 1 (default)', default=True)
group1.add_argument('--flag2', action='store_true', help='Flag 2 in Group 1')

# Define the second subcommand group with default value and alias
group2 = main_subparsers.add_argument_group('Group 2')
group2.add_argument('--flag3', action='store_true', help='Flag 3 in Group 2 (default)', default=True)
group2.add_argument('--flag4', action='store_true', help='Flag 4 in Group 2')

# Parse the command-line arguments
args = parser.parse_args()

# Handle the parsed flags from different groups with default values and aliases
if args.main_command == 'cmd1':
    if args.flag1:
        print('Flag 1 in Group 1 is set (default)')
    elif args.flag2:
        print('Flag 2 in Group 1 is set')
elif args.main_command == 'cmd2':
    if args.flag3:
        print('Flag 3 in Group 2 is set (default)')
    elif args.flag4:
        print('Flag 4 in Group 2 is set')

This code snippet demonstrates how to create a Python script that uses the argparse module to handle command-line arguments. It sets up two groups of mutually exclusive flags, each with their own default values and help messages. The script then parses the command-line arguments based on the specified group and prints a message indicating which flag is set. If no flag is set for a group, it defaults to the group's default value. This setup helps in managing complex command-line options efficiently.

ctypes - A foreign function library for Python.md

ctypes - A foreign function library for Python

The ctypes module in Python provides C compatible data types, and allows calling functions in DLLs or shared libraries. This is useful for interfacing with native libraries and interacting with hardware.

Below are some comprehensive code examples demonstrating various functionalities of the ctypes module:

Example 1: Loading a Shared Library

import ctypes

# Load a shared library (e.g., libSystem.dylib on macOS)
libc = ctypes.CDLL('libSystem.dylib')

# Define the argument types for the printf function
libc.printf.argtypes = [ctypes.c_char_p]

# Define a function from the library using ctypes.CFUNCTYPE
def print_message(message):
    libc.printf(b"%s\n", message.encode())

# Call the function with an argument
print_message("Hello, World!")

Example 2: Passing Arguments and Returning Results

import ctypes

# Load the math library (libSystem.dylib on macOS)
libm = ctypes.CDLL('libSystem.dylib')

# Define the return type and argument types for the sin function
libm.sin.restype = ctypes.c_double
libm.sin.argtypes = [ctypes.c_double]

# Define a function from the library using ctypes.CFUNCTYPE
def sin(x):
    return libm.sin(x)

# Call the function with an argument and print the result
print(f"The sine of 30 degrees (in radians) is: {sin(3.14159 / 6)}")

Example 3: Structures and Pointers

import ctypes

# Define a structure using ctypes.Structure
class Point(ctypes.Structure):
    _fields_ = [("x", ctypes.c_int), ("y", ctypes.c_int)]

# Create an instance of the structure
p1 = Point(5, 10)

# Print the fields of the structure
print(f"Point p1: ({p1.x}, {p1.y})")

# Define a function that takes a pointer to a struct and modifies it
def modify_point(point):
    point.x += 1
    point.y += 2

# Modify the point object using the function
modify_point(p1)
print(f"Modified Point p1: ({p1.x}, {p1.y})")

Example 4: Callback Functions

import ctypes

# Define a callback function type
def my_callback(arg):
    print("Callback called with argument:", arg)

# Register the callback function using ctypes.CFUNCTYPE
callback_type = ctypes.CFUNCTYPE(None, ctypes.c_int)
my_function_pointer = callback_type(my_callback)

# Call the callback function from another function
def call_my_callback():
    my_function_pointer(42)

# Execute the callback function
call_my_callback()

Example 5: Using Enumerations

import ctypes

# Define an enumeration using ctypes.c_int and an enum class
class Color(ctypes.c_int):
    RED = 1
    GREEN = 2
    BLUE = 3

# Create a variable of the enumeration type
color = Color.RED

# Print the value of the enumeration
print(f"The color is {color}")

# Define a function that takes an enum and returns its name
def get_color_name(color):
    color_names = {
        Color.RED: "Red",
        Color.GREEN: "Green",
        Color.BLUE: "Blue"
    }
    return color_names[color]

# Get the name of the color
print(f"The name of the color is {get_color_name(color)}")

Example 6: Dynamic Library Path

import ctypes

# Load a shared library using an absolute path
lib_path = "/usr/local/lib/libyourlib.dylib"
my_lib = ctypes.CDLL(lib_path)

# Define a function from the loaded library
def my_lib_function():
    result = ctypes.c_int()
    my_lib.my_lib_function(ctypes.byref(result))
    return result.value

# Call the function and print the result
print(f"The result of my_lib_function is: {my_lib_function()}")

Example 7: Loading a Shared Library with Multiple Symbols

import ctypes

# Load a shared library with multiple symbols
lib = ctypes.CDLL('libexample.dylib')

# Define functions from the library using ctypes.CFUNCTYPE
def function1(arg):
    result = ctypes.c_int()
    lib.function1(ctypes.byref(result), arg)
    return result.value

def function2(arg):
    result = ctypes.c_double()
    lib.function2.argtypes = [ctypes.c_float]
    lib.function2.restype = ctypes.c_double
    lib.function2(ctypes.c_float(arg))
    return result.value

# Call the functions and print the results
print(f"Result of function1(5): {function1(5)}")
print(f"Result of function2(3.14): {function2(3.14)}")

Example 8: Passing Structures to Functions

import ctypes

# Define a structure using ctypes.Structure
class Rectangle(ctypes.Structure):
    _fields_ = [("width", ctypes.c_int), ("height", ctypes.c_int)]

# Create an instance of the structure
rect = Rectangle(10, 20)

# Define a function from the library that takes a pointer to a struct
def print_rect(rect_ptr):
    rect_obj = ctypes.cast(rect_ptr, ctypes.POINTER(Rectangle)).contents
    print(f"Rectangle: Width={rect_obj.width}, Height={rect_obj.height}")

# Call the function with a pointer to the structure
print_rect(ctypes.byref(rect))

These examples demonstrate various ways to use the ctypes module for interfacing with native libraries, including loading shared libraries, passing arguments and returning results, using structures and pointers, working with callback functions, enumerations, dynamic library paths, handling multiple symbols in a single load, and passing structures to functions.

curses - Terminal handling for character-cell displays.md

curses - Terminal handling for character-cell displays

The curses module in Python provides a way to write text-based user interfaces in a terminal. It allows you to create interactive programs that can respond to keyboard input, provide color support, and handle mouse events.

Below are comprehensive examples demonstrating various functionalities of the curses module:

Example 1: Basic Terminal Screen Manipulation

import curses

def main(stdscr):
    # Clear the screen
    stdscr.clear()

    # Set the cursor position to (0, 0)
    stdscr.move(0, 0)

    # Display a message on the terminal
    stdscr.addstr("Welcome to curses world!")

    # Refresh the screen to show the changes
    stdscr.refresh()

    # Wait for user input before exiting
    stdscr.getch()

# Start the application and run the `main` function
curses.wrapper(main)

Explanation: - The curses.wrapper() function is used to initialize and clean up the curses environment. It takes a callable as an argument, which in this case is the main function. - Inside main, we first clear the screen using stdscr.clear(). - We then set the cursor position to (0, 0) using stdscr.move(0, 0). - The message "Welcome to curses world!" is added to the screen using stdscr.addstr(). - stdscr.refresh() updates the display on the terminal. - Finally, we wait for user input using stdscr.getch() before exiting the program.

Example 2: Handling Keyboard Input

import curses

def main(stdscr):
    # Clear the screen
    stdscr.clear()

    while True:
        # Wait for a key press
        ch = stdscr.getch()

        if ch == ord('q'):
            break

        # Display the pressed key
        stdscr.addstr("You pressed: " + chr(ch) + "\n")

        # Refresh the screen to show the changes
        stdscr.refresh()

# Start the application and run the `main` function
curses.wrapper(main)

Explanation: - The program waits for a key press using stdscr.getch(). - If 'q' is pressed, it breaks out of the loop. - The pressed character (converted to its ASCII representation) is displayed on the screen. - The screen is refreshed after each character is printed.

Example 3: Color Support

import curses

def main(stdscr):
    # Initialize color support
    if not curses.has_colors():
        stdscr.addstr("Your terminal does not support colors.")
        stdscr.refresh()
        stdscr.getch()
        return

    curses.start_color()

    # Define colors (0 for black, 14 for bright green)
    curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)

    # Clear the screen
    stdscr.clear()

    while True:
        # Move the cursor to a specific position
        stdscr.move(0, 5)

        # Display text with color
        stdscr.addstr("This is green text!", curses.color_pair(1))

        # Refresh the screen to show the changes
        stdscr.refresh()

        # Wait for a key press
        ch = stdscr.getch()

# Start the application and run the `main` function
curses.wrapper(main)

Explanation: - Color support is enabled using curses.start_color(). - We define a color pair where 14 is bright green on black using curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK). - The cursor moves to position (0, 5), and the text "This is green text!" is displayed with the defined color. - The screen is refreshed after each update, and the program waits for a key press before exiting.

Example 4: Handling Mouse Events

import curses


def main(stdscr):
    # Initialize mouse support
    stdscr.keypad(True)
    curses.mousemask(curses.ALL_MOUSE_EVENTS)

    while True:
        # Wait for a mouse event
        event = stdscr.getch()
        if event == curses.KEY_MOUSE:
            _, x, y, _, _ = curses.getmouse()

            # Clear the screen
            stdscr.clear()

            # Print the coordinates of the mouse click
            stdscr.addstr("Mouse clicked at: ({}, {})".format(x, y))

            # Refresh the screen to show the changes
            stdscr.refresh()


# Start the application and run the `main` function
curses.wrapper(main)

Explanation: - Mouse support is enabled by setting the keypad and mouse mask. - The program waits for a mouse event using stdscr.getmouse(). - Once an event occurs, the coordinates of the mouse click are retrieved. - These coordinates are printed on the screen. - The screen is refreshed after each update.

Example 5: Creating a Simple Menu

import curses

def main(stdscr):
    # Clear the screen
    stdscr.clear()

    # Create a window for the menu
    win = curses.newwin(10, 20, 3, 5)
    win.box()
    win.refresh()

    while True:
        # Display menu options
        win.addstr(2, 2, "1. Option 1")
        win.addstr(4, 2, "2. Option 2")
        win.addstr(6, 2, "3. Exit")

        # Get user input
        ch = win.getch()

        if ch == ord('1'):
            stdscr.addstr(0, 0, "Option 1 selected")
        elif ch == ord('2'):
            stdscr.addstr(0, 0, "Option 2 selected")
        elif ch == ord('3'):
            break

        # Clear the menu after selection
        win.clear()
        win.box()
        win.refresh()
        stdscr.refresh()

# Start the application and run the `main` function
curses.wrapper(main)

Explanation: - A new window is created using curses.newwin() with dimensions 10x20 starting at position (3, 5). - The window is framed with a box. - The menu options are displayed on this window. - User input is captured from the user using win.getch(). - If 'q' is pressed, the loop breaks and the program exits. - After an option is selected, the menu is cleared before displaying it again.

These examples demonstrate basic usage of the curses module, covering terminal screen manipulation, keyboard input handling, color support, mouse events, and creating a simple menu. You can expand upon these examples to build more complex applications using the powerful features provided by the curses module.

curses.ascii - Utilities for ASCII characters.md

curses.ascii - Utilities for ASCII characters

The curses.ascii module provides a set of functions that handle ASCII character operations in a way similar to those found in the C library. This is useful for applications that require text processing and need to interact with ASCII-only data.

Here are comprehensive code examples demonstrating various functionalities provided by the curses.ascii module:

Example 1: Character Classification

import curses.ascii as ascii

def classify_character(character):
    """
    Classify an ASCII character based on its properties.

    :param character: A single ASCII character.
    :return: A classification string indicating character type.
    """
    if ascii.islower(character):
        return "Lowercase"
    elif ascii.isupper(character):
        return "Uppercase"
    elif ascii.isdigit(character):
        return "Digit"
    elif ascii.ispunct(character):
        return "Punctuation"
    elif ascii.isspace(character):
        return "Whitespace"
    else:
        return "Other"

# Example usage
char = 'A'
classification = classify_character(char)
print(f"The character '{char}' is a {classification}.")

Example 2: Character Conversion

import curses.ascii as ascii

def convert_case(character):
    """
    Convert an ASCII character to uppercase or lowercase.

    :param character: A single ASCII character.
    :return: The converted character.
    """
    if ascii.islower(character):
        return character.upper()
    elif ascii.isupper(character):
        return character.lower()
    else:
        return character

# Example usage
char = 'a'
converted_char = convert_case(char)
print(f"The case of '{char}' is converted to '{converted_char}'.")

Example 3: Character Arithmetic

import curses.ascii as ascii

def shift_character_right(character, amount):
    """
    Shift an ASCII character right by a specified number of positions.

    :param character: A single ASCII character.
    :param amount: Number of positions to shift the character.
    :return: The shifted character.
    """
    if ascii.isalpha(character):
        return chr((ord(character) + amount - 97) % 26 + 97)
    else:
        return character

# Example usage
char = 'A'
shift_amount = 3
shifted_char = shift_character_right(char, shift_amount)
print(f"The character '{char}' shifted right by {shift_amount} is '{shifted_char}'.")

Example 4: Character Equality and Comparison

import curses.ascii as ascii

def compare_characters(char1, char2):
    """
    Compare two ASCII characters.

    :param char1: First ASCII character.
    :param char2: Second ASCII character.
    :return: A comparison result (0 if equal, -1 if less than, 1 if greater than).
    """
    if ord(char1) == ord(char2):
        return 0
    elif ord(char1) < ord(char2):
        return -1
    else:
        return 1

# Example usage
char1 = 'B'
char2 = 'A'
comparison_result = compare_characters(char1, char2)
print(f"The comparison of '{char1}' and '{char2}' is: {comparison_result}")

Example 5: Character Properties

import curses.ascii as ascii

def character_properties(character):
    """
    Retrieve properties of an ASCII character.

    :param character: A single ASCII character.
    :return: Dictionary with properties of the character.
    """
    return {
        'islower': ascii.islower(character),
        'isupper': ascii.isupper(character),
        'isdigit': ascii.isdigit(character),
        'ispunct': ascii.ispunct(character),
        'isspace': ascii.isspace(character)
    }

# Example usage
char = ' '
properties = character_properties(char)
print(f"Properties of '{char}': {properties}")

Summary

These examples demonstrate how to use the curses.ascii module for various character operations, including classification, conversion, arithmetic shifts, comparison, and property retrieval. Each example includes comments explaining the purpose and functionality of each code snippet, making it suitable for integration into official documentation or application development projects.

curses.panel - A panel stack extension for curses.md

curses.panel - A panel stack extension for curses

The curses.panel module provides a set of functions to create, manipulate, and manage panels within a curses window. Panels are useful for organizing multiple windows on the screen and allowing them to be stacked on top of each other with z-order management. Below are comprehensive code examples demonstrating various functionalities provided by the curses.panel module.

Example 1: Creating and Displaying Multiple Panels

import curses
from curses import panel as p

def main(stdscr):
    # Initialize the screen
    stdscr.clear()
    stdscr.refresh()

    # Create a new window
    win1 = curses.newwin(5, 10, 2, 5)
    win2 = curses.newwin(3, 8, 7, 3)

    # Create panels for each window
    p1 = p.new_panel(win1)
    p2 = p.new_panel(win2)

    # Update the stack to bring panel1 to the front
    p.update_panels()

    # Refresh the screen with all panels
    stdscr.refresh()

    # Add some content to win1 and win2
    stdscr.addstr(3, 6, "Panel 1")
    stdscr.addstr(5, 7, "Panel 2")

    # Get user input to change panel order
    key = stdscr.getch()

    if key == ord('1'):
        p.update_panels()  # Bring win1 to the front
        stdscr.refresh()
    elif key == ord('2'):
        p.update_panels()  # Bring win2 to the front
        stdscr.refresh()

curses.wrapper(main)

Example 2: Moving a Panel

import curses
from curses import panel as p

def main(stdscr):
    # Initialize the screen
    stdscr.clear()
    stdscr.refresh()

    # Create two windows and their panels
    win1 = curses.newwin(5, 10, 2, 5)
    win2 = curses.newwin(3, 8, 7, 3)

    p1 = p.new_panel(win1)
    p2 = p.new_panel(win2)

    # Update the stack to bring panel1 to the front
    p.update_panels()
    stdscr.refresh()

    # Move win1 below win2 by swapping their positions in the panel stack
    p.swapwin(p1, p2)
    p.update_panels()
    stdscr.refresh()

curses.wrapper(main)

Example 3: Hiding and Showing Panels

import curses
from curses import panel as p

def main(stdscr):
    # Initialize the screen
    stdscr.clear()
    stdscr.refresh()

    # Create two windows and their panels
    win1 = curses.newwin(5, 10, 2, 5)
    win2 = curses.newwin(3, 8, 7, 3)

    p1 = p.new_panel(win1)
    p2 = p.new_panel(win2)

    # Update the stack to bring panel1 to the front
    p.update_panels()
    stdscr.refresh()

    # Hide win2 by calling hide()
    p.hide(p2)
    p.update_panels()

    # Display win2 by calling show()
    p.show(p2)
    p.update_panels()

curses.wrapper(main)

Example 4: Deleting a Panel

import curses
from curses import panel as p

def main(stdscr):
    # Initialize the screen
    stdscr.clear()
    stdscr.refresh()

    # Create two windows and their panels
    win1 = curses.newwin(5, 10, 2, 5)
    win2 = curses.newwin(3, 8, 7, 3)

    p1 = p.new_panel(win1)
    p2 = p.new_panel(win2)

    # Update the stack to bring panel1 to the front
    p.update_panels()
    stdscr.refresh()

    # Delete win2 by calling delete_panel()
    p.delete_panel(p2)
    p.update_panels()

curses.wrapper(main)

Example 5: Getting and Setting Panel Attributes

import curses
from curses import panel as p

def main(stdscr):
    # Initialize the screen
    stdscr.clear()
    stdscr.refresh()

    # Create two windows and their panels
    win1 = curses.newwin(5, 10, 2, 5)
    win2 = curses.newwin(3, 8, 7, 3)

    p1 = p.new_panel(win1)
    p2 = p.new_panel(win2)

    # Update the stack to bring panel1 to the front
    p.update_panels()
    stdscr.refresh()

    # Get and print the attributes of win1
    attrs = p.get_attr(p1)
    print(f"Attributes of win1: {attrs}")

    # Set new attributes for win2 (e.g., curses.A_REVERSE)
    p.set_attr(p2, curses.A_REVERSE)
    p.update_panels()
    stdscr.refresh()

curses.wrapper(main)

Explanation

These examples cover the basic functionalities of managing panels in a curses application, from creating and showing them to managing their stacking order and attributes.

curses.textpad - Text input widget for curses programs.md

curses.textpad - Text input widget for curses programs

The curses module in Python is a powerful library for creating text-based user interfaces, which can be used to build console applications that offer interactive functionality. The textpad sub-module provides several classes and functions to create text input widgets that are useful in such applications.

Below are comprehensive code examples for each of the functionalities provided by the curses.textpad module:

1. Creating a Simple Text Input Widget

import curses
from curses import textpad

def main(stdscr):
    # Clear and refresh the screen to ensure that previous output doesn't remain
    stdscr.clear()
    stdscr.refresh()

    # Create a window for the input field
    height, width = 5, 20
    win = curses.newwin(height, width, 1, 1)
    win.keypad(True)  # Enable keypad

    # Set up text attributes
    curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)

    # Initialize the input field with some initial text
    message = "Enter your text:"
    input_win = textpad.Textbox(win, max_input=20)
    win.addstr(0, 0, message, curses.color_pair(1))
    win.refresh()

    # Capture user input
    user_input = input_win.edit()
    if user_input:
        win.addstr(height - 1, 1, "You entered: " + user_input)

    # End the session and clean up
    stdscr.keypad(False)
    curses.endwin()

if __name__ == "__main__":
    curses.wrapper(main)

Explanation:

2. Adding Multiple Lines to the Text Input Widget

import curses
from curses import textpad

def main(stdscr):
    # Clear and refresh the screen
    stdscr.clear()
    stdscr.refresh()

    # Create a window for the input field
    height, width = 10, 30
    win = curses.newwin(height, width, 1, 1)
    win.keypad(True)

    # Set up text attributes
    curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK)

    # Initialize a list to store messages and their corresponding edit positions
    messages = ["Enter your first line:", "Enter your second line:"]
    lines = []
    max_input_length = 20

    for i, message in enumerate(messages):
        # Add the message to the window
        win.addstr(i + 1, 0, message, curses.color_pair(1))
        # Create a textbox for each line and append it to the list
        lines.append(textpad.Textbox(win, max_input_length=max_input_length))

    # Refresh the window to display the messages
    win.refresh()

    # Capture user input for each line
    for i in range(len(messages)):
        lines[i].edit()
        if lines[i].value():
            win.addstr(i + 2, 1, "Line {}: {}".format(i + 1, lines[i].value()))

    # End the session and clean up
    stdscr.keypad(False)
    curses.endwin()

if __name__ == "__main__":
    curses.wrapper(main)

Explanation:

3. Handling Key Events

import curses
from curses import textpad

def main(stdscr):
    # Clear and refresh the screen
    stdscr.clear()
    stdscr.refresh()

    # Create a window for the input field
    height, width = 6, 15
    win = curses.newwin(height, width, 1, 1)
    win.keypad(True)

    # Set up text attributes
    curses.init_pair(1, curses.COLOR_YELLOW, curses.COLOR_BLACK)

    # Initialize a textbox for user input
    message = "Enter some text:"
    input_win = textpad.Textbox(win, max_input_length=15)
    win.addstr(0, 0, message, curses.color_pair(1))
    win.refresh()

    # Capture user input
    user_input = input_win.edit()
    if user_input:
        win.addstr(height - 2, 1, "You entered: " + user_input)

    # Handle key events
    while True:
        key = stdscr.getch()
        if key == ord('q'):
            break
        elif key == curses.KEY_UP:
            win.addstr(0, 0, message, curses.color_pair(2))
            win.refresh()

    # End the session and clean up
    stdscr.keypad(False)
    curses.endwin()

if __name__ == "__main__":
    curses.wrapper(main)

Explanation:

These examples demonstrate various functionalities of the curses.textpad module, from simple single-line input to handling multiple lines and key events. They are designed to be clear, concise, and follow best practices for inclusion in official documentation.

errno - Standard errno system symbols.md

errno - Standard errno system symbols

Certainly! Below is a comprehensive set of code examples demonstrating various functionalities provided by the errno module in Python's standard library. These examples are designed to be clear, concise, and suitable for inclusion in official documentation.

1. Accessing Error Numbers

The errno module provides a dictionary-like object that maps error numbers to their corresponding symbolic names. Here's how you can access these values:

import errno

# Example: Get the symbolic name for an error number
try:
    with open('nonexistent_file.txt', 'r') as file:
        pass
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e.errno}")  # Output: File not found (2)
    print(errno.errorcode[e.errno])             # Output: ENOENT

# Example: Accessing a specific error number directly
print(errno.ENOENT)                   # Output: 2

2. Handling Errors in I/O Operations

The errno module is useful for handling errors that occur during file operations or other I/O-related tasks.

import errno
import os

try:
    # Attempt to remove a non-existent directory
    os.rmdir('nonexistent_directory')
except OSError as e:
    print(f"OSError: {e.errno}")  # Output: Directory not found (2)
    print(errno.errorcode[e.errno])     # Output: ENOTDIR

# Using errno directly in an exception block
try:
    with open('nonexistent_file.txt', 'r') as file:
        pass
except OSError as e:
    if e.errno == errno.ENOENT:
        print("File not found")

3. Error Codes for File Operations

The errno module provides specific error codes for various file operations.

import errno
import os

try:
    # Attempt to open a non-existent file
    with open('nonexistent_file.txt', 'r') as file:
        pass
except OSError as e:
    print(f"FileNotFoundError: {e.errno}")  # Output: File not found (2)
    if e.errno == errno.ENOENT:
        print("File does not exist")

# Error codes for specific file operations
try:
    # Attempt to remove a non-empty directory
    os.rmdir('empty_directory')
except OSError as e:
    print(f"DirectoryNotEmptyError: {e.errno}")  # Output: Directory is not empty (30)
    if e.errno == errno.ENOTEMPTY:
        print("Directory is not empty")

# Error codes for specific I/O errors
try:
    with open('nonexistent_file.txt', 'r') as file:
        pass
except IOError as e:
    print(f"IOError: {e.errno}")  # Output: Input/output error (5)

4. Error Codes for General I/O Errors

The errno module provides specific error codes for general input/output errors.

import errno

# Example: Handling a general IO error
try:
    file = open('nonexistent_file.txt', 'r')
    content = file.read()
except IOError as e:
    print(f"IOError: {e.errno}")  # Output: Input/output error (5)
    if e.errno == errno.EIO:
        print("I/O error occurred")

# Handling a specific I/O error
try:
    with open('nonexistent_file.txt', 'r') as file:
        pass
except IOError as e:
    if e.errno == errno.ESPIPE:
        print("Pipe error")

5. Error Codes for Permissions Issues

The errno module provides specific error codes for permission issues.

import errno
import os

try:
    # Attempt to write to a read-only file
    with open('readonly_file.txt', 'w') as file:
        file.write("Hello, World!")
except IOError as e:
    print(f"IOError: {e.errno}")  # Output: Permission denied (13)
    if e.errno == errno.EACCES:
        print("Permission denied")

6. Error Codes for Connection Issues

The errno module provides specific error codes for connection issues.

import socket
import errno

try:
    # Attempt to connect to a non-existent server
    sock = socket.create_connection(('nonexistent_server', 80))
except ConnectionRefusedError as e:
    print(f"ConnectionRefusedError: {e.errno}")  # Output: Connection refused (111)
    if e.errno == errno.ECONNREFUSED:
        print("Connection refused")

# Handling a specific connection error
try:
    with socket.create_connection(('localhost', 80)) as sock:
        pass
except IOError as e:
    if e.errno == errno.ETIMEDOUT:
        print("Connection timeout")

7. Error Codes for Timeout Issues

The errno module provides specific error codes for timeout issues.

import socket
import time

try:
    # Attempt to connect to a server with a timeout
    sock = socket.create_connection(('localhost', 80), timeout=1)
except IOError as e:
    print(f"IOError: {e.errno}")  # Output: Connection timed out (110)
    if e.errno == errno.ETIMEDOUT:
        print("Connection timed out")

8. Error Codes for Invalid Argument Issues

The errno module provides specific error codes for invalid argument issues.

import os

try:
    # Attempt to open a file with an invalid path
    with open('invalid:/path/to/file', 'r') as file:
        pass
except OSError as e:
    print(f"OSError: {e.errno}")  # Output: Invalid argument (22)
    if e.errno == errno.EINVAL:
        print("Invalid argument")

9. Error Codes for File System Full Issues

The errno module provides specific error codes for file system full issues.

import os

try:
    with open('full_file.txt', 'wb') as file:
        # Simulate filling the disk
        file.write(b'a' * (os.statvfs('/').f_frsize * 1024**2))
except IOError as e:
    print(f"IOError: {e.errno}")  # Output: No space left on device (28)
    if e.errno == errno.ENOSPC:
        print("No space left on the device")

10. Error Codes for Path Not Found Issues

The errno module provides specific error codes for path not found issues.

import os

try:
    # Attempt to access a non-existent file
    with open('nonexistent_file.txt', 'r') as file:
        pass
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e.errno}")  # Output: No such file or directory (2)
    if e.errno == errno.ENOENT:
        print("File not found")

These examples demonstrate various ways to use the errno module to handle errors in Python, covering common I/O operations and error conditions. The code is designed to be clear, self-contained, and suitable for integration into documentation.

getpass - Portable password input.md

getpass - Portable password input

The getpass module in the Python standard library provides a way to prompt for passwords securely without echoing them on the screen. This is particularly useful for applications that need to handle user credentials, such as web servers or command-line interfaces.

Here are comprehensive code examples for each functionality provided by the getpass module:

import getpass

# Example 1: Prompting for a password without echoing it
def prompt_for_password():
    """
    Prompts the user to enter their password securely.

    Returns:
        str: The password entered by the user.
    """
    try:
        # Use getpass.getpass() to prompt for password input and ensure it is not echoed on screen
        password = getpass.getpass("Enter your password: ")
        return password
    except KeyboardInterrupt:
        print("\nPassword entry aborted.")
        return None

# Example 2: Prompting for a password with echo enabled (used for compatibility)
def prompt_for_password_echo_enabled():
    """
    Prompts the user to enter their password with echoing enabled.

    Returns:
        str: The password entered by the user.
    """
    try:
        # Use getpass.getpass() without any options to enable echoing
        password = getpass.getpass("Enter your password (will be displayed): ")
        return password
    except KeyboardInterrupt:
        print("\nPassword entry aborted.")
        return None

# Example 3: Prompting for a password with the `curses` module support
def prompt_for_password_curses():
    """
    Prompts the user to enter their password securely using the curses library.

    Returns:
        str: The password entered by the user.
    """
    try:
        # Import necessary functions from getpass and curses modules
        import curses

        # Initialize a new screen session
        stdscr = curses.initscr()

        # Use getpass.getpass() with a custom prompt for curses interface
        password = getpass.curses_getpass("Enter your password: ")

        # Restore the terminal to its original state
        curses.endwin()

        return password
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

# Example 4: Prompting for a username without echoing it
def prompt_for_username():
    """
    Prompts the user to enter their username securely.

    Returns:
        str: The username entered by the user.
    """
    try:
        # Use getpass.getuser() to get the current logged-in user's username
        username = getpass.getuser()
        return username
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

# Example 5: Prompting for a password using different methods and combining them
def prompt_for_secure_password():
    """
    Demonstrates multiple ways to prompt for a secure password.

    Returns:
        str: The password entered by the user, or None if aborted.
    """
    try:
        # Use getpass.getpass() in one of the above examples and print the result
        print("Using default getpass function:")
        password = prompt_for_password()

        # Prompt for password with echo enabled
        print("\nPrompting with echo enabled:")
        password_echo_enabled = prompt_for_password_echo_enabled()

        # Prompt for password using curses interface
        print("\nPrompting using curses interface:")
        password_curses = prompt_for_password_curses()

        # Prompt for username securely
        print("\nPrompting for a username:")
        username = prompt_for_username()

        return (password, password_echo_enabled, password_curses, username)
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

# Example usage of the functions
if __name__ == "__main__":
    # Call the function to demonstrate multiple password prompt methods
    secure_passwords = prompt_for_secure_password()

    if secure_passwords is not None:
        for i, password in enumerate(secure_passwords):
            if password is not None:
                print(f"Result {i+1}: {password}")

Explanation:

io - Core tools for working with streams.md

io - Core tools for working with streams

The io module in Python is a core module that provides support for file-like objects, including handling different types of streams such as binary files and text files. Below are comprehensive and well-documented code examples for various functionalities within the io module.

1. Basic File Handling

Reading from a File

This example demonstrates how to read data from a file using the built-in open() function.

# Importing the io module for file handling
import io

def read_file(filename):
    try:
        # Open the file in read mode
        with open(filename, 'r') as file:
            # Read the content of the file
            content = file.read()
            print("Content of the file:")
            print(content)
    except FileNotFoundError:
        print(f"File '{filename}' not found.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
read_file('example.txt')

2. Writing to a File

Writing Text to a File

This example shows how to write text to a file using the write() method of a file object.

# Importing the io module for file handling
import io

def write_to_file(filename, content):
    try:
        # Open the file in write mode (overwrites existing content)
        with open(filename, 'w') as file:
            # Write content to the file
            file.write(content)
        print("Content written successfully.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
write_to_file('example.txt', "Hello, World!\nThis is a test file.")

Writing Binary Data to a File

This example demonstrates how to write binary data to a file using the write() method.

# Importing the io module for file handling
import io

def write_binary_data(filename, binary_data):
    try:
        # Open the file in binary write mode (overwrites existing content)
        with open(filename, 'wb') as file:
            # Write binary data to the file
            file.write(binary_data)
        print("Binary data written successfully.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
binary_data = b'\x48\x65\x6c\x6c\x6f'  # ASCII representation of 'Hello'
write_binary_data('example.bin', binary_data)

3. Appending to a File

Appending Text to a File

This example shows how to append text to an existing file using the write() method.

# Importing the io module for file handling
import io

def append_to_file(filename, content):
    try:
        # Open the file in append mode (adds new content at the end)
        with open(filename, 'a') as file:
            # Append content to the file
            file.write(content)
        print("Content appended successfully.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
append_to_file('example.txt', "\nThis is additional text.")

Appending Binary Data to a File

This example demonstrates how to append binary data to an existing file using the write() method.

# Importing the io module for file handling
import io

def append_binary_data(filename, binary_data):
    try:
        # Open the file in binary append mode (adds new data at the end)
        with open(filename, 'ab') as file:
            # Append binary data to the file
            file.write(binary_data)
        print("Binary data appended successfully.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
binary_data = b'\x57\x6f\x72\x6c\x64'  # ASCII representation of 'World'
append_binary_data('example.bin', binary_data)

4. Text Stream Handling

Reading Lines from a File

This example shows how to read lines from a file using the readlines() method.

# Importing the io module for file handling
import io

def read_lines_from_file(filename):
    try:
        # Open the file in read mode
        with open(filename, 'r') as file:
            # Read all lines from the file
            lines = file.readlines()
            print("Lines in the file:")
            for line in lines:
                print(line.strip())  # Remove newline characters
    except FileNotFoundError:
        print(f"File '{filename}' not found.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
read_lines_from_file('example.txt')

Writing Lines to a File

This example shows how to write lines to a file using the writelines() method.

# Importing the io module for file handling
import io

def write_lines_to_file(filename, lines):
    try:
        # Open the file in write mode (overwrites existing content)
        with open(filename, 'w') as file:
            # Write a list of lines to the file
            file.writelines(lines)
        print("Lines written successfully.")
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
lines = ["Line 1\n", "Line 2\n", "Line 3"]
write_lines_to_file('example.txt', lines)

5. Buffering

Using Buffered I/O with io.StringIO

This example demonstrates how to use a buffered string stream for in-memory file operations.

# Importing the io module for file handling
import io

def buffer_string_io():
    try:
        # Create a StringIO object
        buffer = io.StringIO()

        # Write content to the buffer
        buffer.write("This is a buffered string.\n")
        buffer.write("Another line.")

        # Get the current position in the buffer
        print(f"Current position: {buffer.tell()}")

        # Seek to a specific position
        buffer.seek(0)

        # Read content from the buffer
        content = buffer.read()
        print("Content of the buffer:")
        print(content.strip())

        # Flush the buffer and close it
        buffer.close()
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
buffer_string_io()

6. BytesIO for Binary Data

Using Buffered I/O with io.BytesIO

This example demonstrates how to use a buffered binary stream for in-memory file operations.

# Importing the io module for file handling
import io

def buffer_bytes_io():
    try:
        # Create a BytesIO object
        buffer = io.BytesIO()

        # Write binary data to the buffer
        buffer.write(b'This is buffered binary.\n')
        buffer.write(b'Another line.')

        # Get the current position in the buffer
        print(f"Current position: {buffer.tell()}")

        # Seek to a specific position
        buffer.seek(0)

        # Read binary data from the buffer
        content = buffer.read()
        print("Content of the buffer:")
        print(content.decode('utf-8'))  # Decode bytes to string

        # Flush the buffer and close it
        buffer.close()
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
buffer_bytes_io()

These examples cover various aspects of file handling, including reading and writing text and binary data, appending to files, handling different types of streams (text and binary), and using buffered I/O with StringIO and BytesIO.

logging - Logging facility for Python.md

logging - Logging facility for Python

The logging module in Python provides a flexible framework for emitting log messages from Python programs. It supports formatting, coloring, and redirection of output to various destinations. Below are comprehensive code examples that demonstrate various functionalities of the logging module.

Example 1: Basic Configuration

This example shows how to configure basic logging settings.

import logging

# Create a logger object
logger = logging.getLogger('my_logger')

# Set the level of the logger
logger.setLevel(logging.DEBUG)

# Create a console handler and set its level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# Create a formatter and add it to the handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# Add the handler to the logger
logger.addHandler(ch)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

Example 2: Logging to Files

This example shows how to configure logging to write messages to a file.

import logging

# Create a logger object
logger = logging.getLogger('file_logger')
logger.setLevel(logging.DEBUG)

# Create a file handler and set its level
fh = logging.FileHandler('app.log')
fh.setLevel(logging.ERROR)

# Create a formatter and add it to the handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)

# Add the handler to the logger
logger.addHandler(fh)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

Example 3: Logging with Custom Handlers

This example shows how to create a custom logging handler.

import logging

class MyHandler(logging.Handler):
    def emit(self, record):
        # Custom logic for handling log records
        print(f"Custom Handler - {record.levelname}: {record.getMessage()}")

# Create a logger object
logger = logging.getLogger('my_handler_logger')
logger.setLevel(logging.DEBUG)

# Create an instance of the custom handler and set its level
ch = MyHandler()
ch.setLevel(logging.ERROR)

# Add the custom handler to the logger
logger.addHandler(ch)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

Example 4: Logging with Formatters

This example shows how to create and use different log record formats.

import logging

# Create a logger object
logger = logging.getLogger('formatter_logger')
logger.setLevel(logging.DEBUG)

# Create a console handler and set its level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# Define different formatters for different levels
formatter1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter2 = logging.Formatter('%(name)s: %(message)s')

# Add each formatter to the handler based on the log level
if logger.level == logging.DEBUG:
    ch.setFormatter(formatter1)
else:
    ch.setFormatter(formatter2)

# Add the handler to the logger
logger.addHandler(ch)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

Example 5: Logging with Rotating Files

This example shows how to configure logging to rotate log files.

import logging.handlers

# Create a logger object
logger = logging.getLogger('rotating_file_logger')
logger.setLevel(logging.DEBUG)

# Create a rotating file handler and set its level
rh = logging.handlers.RotatingFileHandler('app.log', maxBytes=1024, backupCount=5)
rh.setLevel(logging.INFO)

# Set the formatter for the handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rh.setFormatter(formatter)

# Add the handler to the logger
logger.addHandler(rh)

# Log messages at different levels
for i in range(10):
    logger.debug(f'This is a debug message {i+1}.')

Example 6: Logging with Timestamps

This example shows how to customize the timestamp format in log records.

import logging

# Create a logger object
logger = logging.getLogger('timestamp_logger')
logger.setLevel(logging.DEBUG)

# Create a console handler and set its level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# Set a custom date format for timestamps
formatter = logging.Formatter('%Y-%m-%d %H:%M:%S - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# Add the handler to the logger
logger.addHandler(ch)

# Log messages at different levels
logger.debug('This is a debug message.')

Example 7: Logging with Levels and Filters

This example shows how to set different log levels and apply filters to log records.

import logging

# Create a logger object
logger = logging.getLogger('level_and_filter_logger')
logger.setLevel(logging.DEBUG)

# Create a console handler and set its level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# Define a filter that only allows warning and error messages
class WarningFilter(logging.Filter):
    def filter(self, record):
        return record.levelno >= logging.WARNING

# Add the filter to the handler
ch.addFilter(WarningFilter())

# Set the formatter for the handler
formatter = logging.Formatter('%(name)s: %(message)s')
ch.setFormatter(formatter)

# Add the handler to the logger
logger.addHandler(ch)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

Example 8: Logging with Handlers and Filters

This example demonstrates how to configure multiple handlers and apply filters.

import logging

# Create a logger object
logger = logging.getLogger('multiple_handlers_logger')
logger.setLevel(logging.DEBUG)

# Create console handlers for different levels
ch_info = logging.StreamHandler()
ch_info.setLevel(logging.INFO)
ch_info.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))

ch_error = logging.StreamHandler()
ch_error.setLevel(logging.ERROR)
ch_error.setFormatter(logging.Formatter('%(name)s: %(message)s'))

# Create a file handler
fh = logging.FileHandler('app.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))

# Define a filter that only allows warning and error messages
class WarningFilter(logging.Filter):
    def filter(self, record):
        return record.levelno >= logging.WARNING

# Add filters to the handlers
ch_info.addFilter(WarningFilter())
ch_error.addFilter(WarningFilter())

# Add handlers to the logger
logger.addHandler(ch_info)
logger.addHandler(ch_error)
logger.addHandler(fh)

# Log messages at different levels
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')

These examples cover various aspects of the logging module, including basic configuration, logging to files, custom handlers and formatters, rotating logs, timestamp customization, levels and filters, and handling multiple handlers and filters. Each example is designed to be clear and self-contained, suitable for integration into larger projects or documentation.

logging.config - Logging configuration.md

logging.config - Logging configuration

Below are comprehensive code examples for the logging.config module in Python's standard library, along with detailed explanations of each example.

1. Basic Configuration using a Dictionary

import logging.config

# Define a dictionary configuration
config = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        },
        'detail': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - '
                      '%(message)s - %(lineno)d - %(filename)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': 'app.log',
            'formatter': 'detail'
        }
    },
    'loggers': {
        'my_logger': {
            'handlers': ['console', 'file'],
            'level': 'INFO'
        }
    }
}

# Apply the configuration
logging.config.dictConfig(config)

# Get a logger instance
logger = logging.getLogger('my_logger')

# Log messages at different levels
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

Explanation:

2. Configuration using a JSON File

import logging.config

# Load configuration from a JSON file
with open('logging_config.json') as f:
    config = json.load(f)

# Apply the configuration
logging.config.dictConfig(config)

# Get a logger instance
logger = logging.getLogger('my_logger')

# Log messages at different levels
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

Explanation:

3. Using a Configuration Module

Create a separate Python file, e.g., logging_config.py, with the following content:

import logging.config

# Define a dictionary configuration
config = {
    'version': 1,
    'disable_existing_loggers': False,
    # ... (same as above)
}

# Apply the configuration
logging.config.dictConfig(config)

Then, in your main application file, import and use this module:

import logging_config

# Get a logger instance
logger = logging.getLogger('my_logger')

# Log messages at different levels
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

Explanation:

These examples demonstrate how to configure logging using different methods, including dictionary-based configuration, JSON file loading, and external configuration modules. Each example follows best practices for clarity and maintainability.

logging.handlers - Logging handlers.md

logging.handlers - Logging handlers

The logging.handlers module in Python provides various handler classes that can be used to send log records to different destinations, such as files, network sockets, or remote servers. Below are comprehensive code examples for each handler class provided by this module. These examples demonstrate how to configure and use these handlers effectively.

1. RotatingFileHandler

This handler rotates the log file after a certain size is reached.

import logging
from logging.handlers import RotatingFileHandler

# Create a logger object
logger = logging.getLogger('RotatingFileHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the log file name and max bytes for rotation
file_handler = RotatingFileHandler('example.log', maxBytes=1048576, backupCount=3)
file_handler.setLevel(logging.INFO)  # Only INFO and above level logs will be handled by this handler

# Create a formatter and set it for the file handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# Add the file handler to the logger
logger.addHandler(file_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

2. TimedRotatingFileHandler

This handler rotates the log file on a schedule, e.g., daily.

import logging
from logging.handlers import TimedRotatingFileHandler

# Create a logger object
logger = logging.getLogger('TimedRotatingFileHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the log file name and rotation interval
file_handler = TimedRotatingFileHandler('example.log', when='midnight', interval=1, backupCount=3)
file_handler.setLevel(logging.WARNING)  # Only WARNING and above level logs will be handled by this handler

# Create a formatter and set it for the file handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# Add the file handler to the logger
logger.addHandler(file_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')
    logger.warning(f'This is a warning message {i}')

3. SocketHandler

This handler sends log records to a TCP server.

import logging
from logging.handlers import SocketHandler

# Create a logger object
logger = logging.getLogger('SocketHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the host and port of the server
server_address = ('localhost', 12345)
socket_handler = SocketHandler(server_address)

# Create a formatter and set it for the socket handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
socket_handler.setFormatter(formatter)

# Add the socket handler to the logger
logger.addHandler(socket_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')
    logger.warning(f'This is a warning message {i}')

4. HTTPServerHandler

This handler sends log records to an HTTP server.

import logging
from logging.handlers import HTTPServerHandler

# Create a logger object
logger = logging.getLogger('HTTPServerHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the URL of the server
url = 'http://localhost:8080'
http_handler = HTTPServerHandler(url, handler_class=None)

# Create a formatter and set it for the HTTP server handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
http_handler.setFormatter(formatter)

# Add the HTTP server handler to the logger
logger.addHandler(http_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')
    logger.warning(f'This is a warning message {i}')

5. QueueHandler and QueueListener

These handlers use a queue to send log records to multiple destinations.

import logging
from logging.handlers import QueueHandler, QueueListener

# Create a logger object
logger = logging.getLogger('QueueHandlerExample')
logger.setLevel(logging.DEBUG)

# Create a queue
queue = logging.Queue()

# Create a file handler and add it to the queue
file_handler = RotatingFileHandler('example.log', maxBytes=1048576, backupCount=3)
queue.addHandler(file_handler)

# Create a socket handler and add it to the queue
socket_handler = SocketHandler(('localhost', 12345))
queue.addHandler(socket_handler)

# Create a logger that uses the queue
logger_queue = logging.getLogger('QueueLogger')
logger_queue.setLevel(logging.INFO)
logger_queue.addHandler(QueueHandler(queue))

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

# Start the queue listener to process the queue and send log records
with QueueListener(queue, file_handler, socket_handler) as listener:
    listener.start()

6. SysLogHandler

This handler sends log records to a syslog server.

import logging
from logging.handlers import SysLogHandler

# Create a logger object
logger = logging.getLogger('SysLogHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the address of the syslog server
syslog_handler = SysLogHandler(address=('localhost', 514))

# Create a formatter and set it for the syslog handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
syslog_handler.setFormatter(formatter)

# Add the syslog handler to the logger
logger.addHandler(syslog_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

7. SMTPHandler

This handler sends log records via email.

import logging
from logging.handlers import SMTPHandler

# Create a logger object
logger = logging.getLogger('SMTPHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the SMTP server and port, and sender and recipient email addresses
smtp_handler = SMTPHandler(mailhost=('localhost', 25), fromaddr='sender@example.com', toaddrs=['recipient@example.com'])

# Create a formatter and set it for the SMTP handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
smtp_handler.setFormatter(formatter)

# Add the SMTP handler to the logger
logger.addHandler(smtp_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

8. NullHandler

This handler does not do anything with the log records.

import logging

# Create a logger object
logger = logging.getLogger('NullHandlerExample')
logger.setLevel(logging.DEBUG)

# Add a null handler to the logger
logger.addHandler(logging.NullHandler())

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

9. MemoryHandler

This handler stores log records in memory and sends them when the queue size reaches a certain limit.

import logging
from logging.handlers import MemoryHandler

# Create a logger object
logger = logging.getLogger('MemoryHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the maximum number of log records to store in memory
memory_handler = MemoryHandler(50)  # Store up to 50 log records in memory

# Add a file handler and add it to the memory handler
file_handler = RotatingFileHandler('example.log', maxBytes=1048576, backupCount=3)
memory_handler.addHandler(file_handler)

# Create a formatter and set it for the memory handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
memory_handler.setFormatter(formatter)

# Add the memory handler to the logger
logger.addHandler(memory_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

10. WatchedFileHandler

This handler watches a file and logs all new lines as they are written.

import logging
from logging.handlers import WatchedFileHandler

# Create a logger object
logger = logging.getLogger('WatchedFileHandlerExample')
logger.setLevel(logging.DEBUG)

# Define the log file name to watch
watched_file_handler = WatchedFileHandler('example.log')

# Create a formatter and set it for the watched file handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
watched_file_handler.setFormatter(formatter)

# Add the watched file handler to the logger
logger.addHandler(watched_file_handler)

# Log some messages
for i in range(10):
    logger.debug(f'This is a debug message {i}')
    logger.info(f'This is an info message {i}')

These examples demonstrate various logging handlers and their use cases. You can choose the appropriate handler based on your specific needs, such as logging to files, sending emails, or processing log records in memory. Each example includes setting up a logger, adding handlers, and configuring the formatter for clarity. Adjust the configuration parameters as needed for your environment.

os - Miscellaneous operating system interfaces.md

os - Miscellaneous operating system interfaces

The os module in Python provides a portable way of using operating system dependent functionality, such as reading or writing to the filesystem, executing programs, and accessing environment variables. Below are comprehensive examples demonstrating various functionalities of the os module.

1. Accessing Environment Variables

import os

def print_environment_variables():
    """
    This function prints all environment variables.
    """
    for name, value in os.environ.items():
        print(f"{name}: {value}")

print_environment_variables()

2. Changing the Current Working Directory

import os

def change_directory(path):
    """
    This function changes the current working directory to the specified path.

    Args:
    path (str): The directory path to which the current working directory should be changed.
    """
    try:
        os.chdir(path)
        print(f"Changed directory to: {os.getcwd()}")
    except FileNotFoundError:
        print("Directory not found.")

change_directory('/path/to/directory')

3. Listing Directory Contents

import os

def list_directory_contents(directory):
    """
    This function lists all contents of the specified directory, including files and subdirectories.

    Args:
    directory (str): The path to the directory whose contents should be listed.
    """
    try:
        contents = os.listdir(directory)
        print(f"Contents of {directory}:")
        for item in contents:
            print(item)
    except FileNotFoundError:
        print("Directory not found.")

list_directory_contents('/path/to/directory')

4. Creating a New Directory

import os

def create_directory(path):
    """
    This function creates a new directory at the specified path.

    Args:
    path (str): The path where the new directory should be created.
    """
    try:
        os.makedirs(path)
        print(f"Directory {path} created successfully.")
    except FileExistsError:
        print("Directory already exists.")

create_directory('/path/to/new/directory')

5. Removing a Directory

import os

def remove_directory(directory):
    """
    This function removes the specified directory.

    Args:
    directory (str): The path to the directory that should be removed.
    """
    try:
        os.rmdir(directory)
        print(f"Directory {directory} removed successfully.")
    except FileNotFoundError:
        print("Directory not found.")
    except OSError as e:
        if e.errno == 30:  # Directory is not empty
            print("Directory is not empty. Please remove all contents first.")
        else:
            print(f"An error occurred: {e}")

remove_directory('/path/to/directory')

6. Executing a Command

import os

def execute_command(command):
    """
    This function executes the specified command in a shell.

    Args:
    command (str): The command to be executed.
    """
    try:
        result = os.system(command)
        print(f"Command executed with result: {result}")
    except Exception as e:
        print(f"An error occurred: {e}")

execute_command('ls -l')

7. Getting Current Working Directory

import os

def get_current_working_directory():
    """
    This function returns the current working directory.
    """
    return os.getcwd()

current_dir = get_current_working_directory()
print(f"Current working directory: {current_dir}")

8. Checking if a File or Directory Exists

import os

def check_file_or_directory_exists(path):
    """
    This function checks if a file or directory exists at the specified path.

    Args:
    path (str): The path to the file or directory.

    Returns:
    bool: True if it exists, False otherwise.
    """
    return os.path.exists(path)

exists = check_file_or_directory_exists('/path/to/file')
print(f"File/Directory exists: {exists}")

9. Getting File or Directory Information

import os

def get_file_info(file_path):
    """
    This function retrieves information about a file or directory.

    Args:
    file_path (str): The path to the file or directory.

    Returns:
    dict: A dictionary containing various attributes of the file or directory.
    """
    try:
        info = os.stat(file_path)
        return {
            'mode': oct(info.st_mode)[2:],  # Convert mode to octal
            'size': info.st_size,          # File size in bytes
            'last_modified': info.st_mtime   # Last modification time
        }
    except FileNotFoundError:
        print("File not found.")
        return {}

file_info = get_file_info('/path/to/file')
print(file_info)

10. Making a Directory with Permissions

import os

def create_directory_with_permissions(path, mode):
    """
    This function creates a new directory at the specified path with the given permissions.

    Args:
    path (str): The path where the new directory should be created.
    mode (int): The permission bits for the directory (e.g., 0o755).
    """
    try:
        os.makedirs(path, mode=mode)
        print(f"Directory {path} created successfully with permissions {oct(mode)[2:]}")
    except FileExistsError:
        print("Directory already exists.")
    except Exception as e:
        print(f"An error occurred: {e}")

create_directory_with_permissions('/path/to/new/directory', 0o755)

These examples demonstrate various functionalities of the os module, covering common tasks such as environment variable manipulation, directory operations, file system navigation, and command execution. Each function is documented with a docstring that explains its purpose, arguments, and return values.

platform - Access to underlying platform s identifying data.md

platform - Access to underlying platformโ€™s identifying data

Below is a comprehensive set of code examples for the platform module in Python, including comments explaining each step.

import platform
import sys

# Example 1: Get the system name
system_name = platform.system()
print(f"System Name: {system_name}")

# Example 2: Get the release version of the operating system
release_version = platform.release()
print(f"Release Version: {release_version}")

# Example 3: Get the architecture of the machine
architecture = platform.architecture()[0]
print(f"Architecture: {architecture}")

# Example 4: Get the Python implementation name
python_implementation = platform.python_implementation()
print(f"Python Implementation: {python_implementation}")

# Example 5: Get the Python version as a tuple (major, minor, micro)
python_version_tuple = sys.version_info
print(f"Python Version Tuple: {python_version_tuple}")

# Example 6: Get the operating system name and release version as a string
os_name_release = platform.platform()
print(f"OS Name and Release: {os_name_release}")

# Example 7: Check if Python is running in a virtual environment
if platform.python_implementation() == "CPython":
    is_virtualenv = hasattr(sys, 'real_prefix') or sys.prefix != sys.base_prefix
else:
    is_virtualenv = False

print(f"Is Virtual Environment: {is_virtualenv}")

# Example 8: Get the Python executable path
python_executable = sys.executable
print(f"Python Executable Path: {python_executable}")

# Example 9: Get the current operating system as a string (e.g., 'Windows', 'Linux')
os_name_short = platform.system()
print(f"OS Name Short: {os_name_short}")

# Example 10: Get the number of processors available
number_of_processors = platform.processor()
print(f"Number of Processors: {number_of_processors}")

# Example 11: Get the operating system's version as a string
os_version_str = platform.version()
print(f"OS Version String: {os_version_str}")

# Example 12: Get the Python version as a tuple (major, minor)
python_version_tuple_short = platform.python_version_tuple()[:2]
print(f"Python Version Tuple Short: {python_version_tuple_short}")

# Example 13: Check if the operating system is Windows
if os_name_short == "Windows":
    print("Running on Windows")
else:
    print("Not running on Windows")

# Example 14: Get the Python implementation as a string (e.g., 'CPython', 'PyPy')
python_implementation_str = platform.python_implementation()
print(f"Python Implementation String: {python_implementation_str}")

# Example 15: Get the operating system's release version as a tuple
os_release_tuple = platform.uname().release
print(f"OS Release Tuple: {os_release_tuple}")

# Example 16: Check if Python is running in an environment that supports virtual environments
is_virtualenv_supporting = hasattr(sys, 'real_prefix') or sys.prefix == sys.base_prefix
print(f"Is Virtual Environment Supporting: {is_virtualenv_supporting}")

# Example 17: Get the current operating system as a string (e.g., 'Windows', 'Linux')
os_name_full = platform.uname().system
print(f"OS Name Full: {os_name_full}")

# Example 18: Get the Python version as a tuple (major, minor)
python_version_tuple_long = sys.version_info[:2]
print(f"Python Version Tuple Long: {python_version_tuple_long}")

# Example 19: Check if the operating system is macOS
if os_name_short == "Darwin":
    print("Running on macOS")
else:
    print("Not running on macOS")

# Example 20: Get the current operating system as a string (e.g., 'Windows', 'Linux')
os_name_agnostic = platform.platform(aliased=True)
print(f"OS Name Agnostic: {os_name_agnostic}")

# Example 21: Get the Python implementation as a tuple
python_implementation_tuple = (sys.version_info.major, sys.version_info.minor)
print(f"Python Implementation Tuple: {python_implementation_tuple}")

# Example 22: Check if the operating system is POSIX-based (Linux, macOS)
is_posix_based = os_name_short in ["Linux", "Darwin"]
print(f"Is POSIX-Based: {is_posix_based}")

# Example 23: Get the current operating system as a string (e.g., 'Windows', 'Linux')
os_name_specific = platform.uname().system
print(f"OS Name Specific: {os_name_specific}")

# Example 24: Get the Python version as a tuple (major, minor)
python_version_tuple_all = sys.version_info[:3]
print(f"Python Version Tuple All: {python_version_tuple_all}")

# Example 25: Check if the operating system is Windows or macOS
is_windows_or_macos = os_name_short in ["Windows", "Darwin"]
print(f"Is Windows or macOS: {is_windows_or_macos}")

Explanation:

These examples provide a comprehensive overview of how to use the platform module to gather system and Python-related information.

time - Time access and conversions.md

time - Time access and conversions

The time module in Python provides a portable way of using operating system-dependent functionality such as time access, conversion of time to human-readable formats, and delay execution.

Here are comprehensive code examples for all functionalities available in the time module:

import time

# Example 1: Retrieve the current time in seconds since the epoch (January 1, 1970)
current_time = time.time()
print(f"Current time in seconds since epoch: {current_time}")

# Example 2: Sleep for a specified number of seconds
seconds_to_sleep = 5
print("Sleeping for 5 seconds...")
time.sleep(seconds_to_sleep)  # This is an I/O-bound sleep, use threading for CPU-bound tasks
print("Time has elapsed!")

# Example 3: Get the current time as a tuple representing local time
local_time_tuple = time.localtime()
print(f"Current local time tuple: {local_time_tuple}")

# Example 4: Format the current time as a string
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time_tuple)
print(f"Formatted current local time: {formatted_time}")

# Example 5: Convert seconds since epoch to a struct_time object
epoch_to_local_time = time.localtime(current_time)
print(f"Epoch time converted to local time tuple: {epoch_to_local_time}")

# Example 6: Get the number of seconds until January 1, 2038 (the year 2038 problem)
year_2038_seconds = (time.struct_time((31, 12, 31, 23, 59, 59, 4, 365)) - time.localtime()).total_seconds()
print(f"Seconds until January 1, 2038: {year_2038_seconds}")

# Example 7: Sleep for a specific amount of time using datetime.timedelta
from datetime import timedelta

sleep_duration = timedelta(seconds=10)
time.sleep(sleep_duration.total_seconds())
print("Time has elapsed with timedelta!")

# Example 8: Convert a given timestamp to UTC and back
timestamp = 1632456000.0  # Example timestamp in seconds
utc_time = time.gmtime(timestamp)
print(f"UTC time tuple from epoch: {utc_time}")
local_time = time.localtime(timestamp)
print(f"Local time tuple from epoch: {local_time}")

# Example 9: Measure the execution time of a block of code using perf_counter
import sys

start_time = time.perf_counter()
# Code to measure
for i in range(1000000):
    pass
end_time = time.perf_counter()
execution_time = end_time - start_time
print(f"Execution time of the loop: {execution_time:.4f} seconds")

# Example 10: Format a timestamp into a human-readable string with timezone information
from pytz import timezone

timestamp = 1632456000.0
local_tz = timezone('US/Eastern')
dt_local = local_tz.localize(time.localtime(timestamp))
formatted_time_with_timezone = dt_local.strftime("%Y-%m-%d %H:%M:%S %Z%z")
print(f"Formatted current local time with timezone: {formatted_time_with_timezone}")

# Example 11: Get the number of days in a given month
days_in_month = time.monthrange(2023, 2)
print(f"Days in February 2023: {days_in_month[1]}")

# Example 12: Get the day of the week for a specific date
day_of_week = time.strftime("%A", time.strptime("2023-10-01", "%Y-%m-%d"))
print(f"Day of the week for October 1, 2023: {day_of_week}")

# Example 13: Get the day of the year
day_of_year = time.strftime("%j", time.strptime("2023-10-01", "%Y-%m-%d"))
print(f"Day of the year for October 1, 2023: {day_of_year}")

# Example 14: Get the Julian day number
jd = time.gmtime(1632456000.0).tm_yday + 1
print(f"Julian Day Number for January 1, 2023: {jd}")

Key Points:

These examples cover a broad range of functionalities provided by the time module, making them useful for various applications, including system monitoring, performance tuning, and time-sensitive operations.

Graphical User Interfaces with Tk

tkinter - Python interface to Tcl Tk.md

tkinter - Python interface to Tcl/Tk

The tkinter module is a standard Python library that provides a high-level, cross-platform GUI toolkit. It allows developers to create graphical user interfaces (GUIs) in Python applications. Below are comprehensive and well-documented code examples for various functionalities of the tkinter module.

Installation

brew install python-tk@3.12

Example 1: Basic Window Application

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Basic Tkinter Window")

# Set the size of the window
root.geometry("300x200")

# Run the application's event loop
root.mainloop()

Explanation: - tk.Tk(): This creates the main window object. - root.title("Basic Tkinter Window"): Sets the title of the window to "Basic Tkinter Window". - root.geometry("300x200"): Specifies the dimensions of the window as 300 pixels wide and 200 pixels high. - root.mainloop(): This starts the main event loop, which keeps the application running until it is closed.

Example 2: Button with Callback Function

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Button with Callback")

def button_click():
    print("Button was clicked!")

# Create a button and assign the callback function
button = tk.Button(root, text="Click Me", command=button_click)
button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.Tk(): Creates the main window object. - button_click is a function that prints a message when called. - tk.Button(root, text="Click Me", command=button_click): Creates a button with the label "Click Me" and assigns the button_click function to its command attribute. - button.pack(): Packs the button into the window. This is necessary for the widget to be displayed. - root.mainloop(): Starts the event loop.

Example 3: Label and Entry Widgets

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Label and Entry")

def get_entry_text():
    print(entry.get())

# Create a label widget
label = tk.Label(root, text="Enter your name:")
label.pack()

# Create an entry widget for user input
entry = tk.Entry(root)
entry.pack()

# Create a button to retrieve the entry text
button = tk.Button(root, text="Submit", command=get_entry_text)
button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.Label(root, text="Enter your name:"): Creates a label widget with the specified text. - entry = tk.Entry(root): Creates an entry widget where users can input text. - button = tk.Button(root, text="Submit", command=get_entry_text): Creates a button that calls get_entry_text when clicked. - entry.get(): Retrieves the text from the entry widget.

Example 4: Listbox and Scrollbar

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Listbox with Scrollbar")

def select_item(event):
    print(f"Selected item: {listbox.get(listbox.curselection())}")

# Create a list of items
items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]

# Create a Listbox widget
listbox = tk.Listbox(root)
for item in items:
    listbox.insert(tk.END, item)
listbox.pack(side=tk.LEFT)

# Create a scrollbar for the Listbox
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

# Configure the Listbox to use the scrollbar
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)

# Bind the <Double-Button-1> event to select an item
listbox.bind("<Double-Button-1>", select_item)

# Run the application's event loop
root.mainloop()

Explanation: - tk.Listbox(root): Creates a listbox widget. - for item in items: listbox.insert(tk.END, item): Populates the listbox with items. - scrollbar = tk.Scrollbar(root): Creates a scrollbar widget. - listbox.config(yscrollcommand=scrollbar.set): Configures the listbox to use the scrollbar. - scrollbar.config(command=listbox.yview): Sets the scrollbar's command to update the listbox's view. - listbox.bind("<Double-Button-1>", select_item): Binds a double-click event to the listbox that prints the selected item.

Example 5: Combobox

import tkinter as tk
from tkinter import ttk

# Create the main window
root = tk.Tk()
root.title("Combobox")

def on_select(event):
    print(f"Selected option: {combobox.get()}")

# Create a list of options
options = ["Option 1", "Option 2", "Option 3"]

# Create a Combobox widget
combobox = ttk.Combobox(root, values=options)
combobox.set(options[0])  # Set the initial value
combobox.pack()

# Bind the <Return> event to trigger the selection
combobox.bind("<Return>", on_select)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Combobox(root, values=options): Creates a combobox widget with predefined options. - combobox.pack(): Packs the combobox into the window. - combobox.bind("<Return>", on_select): Binds the return key to trigger the on_select function.

Example 6: Radiobuttons

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Radiobuttons")

def on_radio_change(*args):
    print(f"Selected option: {variable.get()}")

# Create a variable to store the selected option
variable = tk.StringVar()

# Create Radiobutton widgets
radio1 = tk.Radiobutton(root, text="Option 1", variable=variable, value="option1")
radio2 = tk.Radiobutton(root, text="Option 2", variable=variable, value="option2")
radio3 = tk.Radiobutton(root, text="Option 3", variable=variable, value="option3")

# Pack the Radiobuttons into the window
radio1.pack()
radio2.pack()
radio3.pack()

# Bind the change event to the on_radio_change function
variable.trace_add("write", on_radio_change)

# Run the application's event loop
root.mainloop()

Explanation: - tk.StringVar(): Creates a variable to store the selected option. - Radiobutton(root, text="Option 1", variable=variable, value="option1"): Creates a radiobutton with the specified text and assigns it to the variable. - variable.trace("w", on_radio_change): Binds the change event of the variable to the on_radio_change function.

Example 7: Menubar

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Menubar")

def file_menu():
    print("File menu clicked!")

def edit_menu():
    print("Edit menu clicked!")

# Create a MenuBar widget
menubar = tk.Menu(root)

# Create File and Edit menus
file_menu = tk.Menu(menubar, tearoff=0)
edit_menu = tk.Menu(menubar, tearoff=0)

# Add items to the File menu
file_menu.add_command(label="New", command=file_menu)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.quit)

# Add items to the Edit menu
edit_menu.add_command(label="Cut", command=edit_menu)
edit_menu.add_command(label="Copy", command=edit_menu)
edit_menu.add_command(label="Paste", command=edit_menu)

# Add File and Edit menus to the MenuBar
menubar.add_cascade(label="File", menu=file_menu)
menubar.add_cascade(label="Edit", menu=edit_menu)

# Set the MenuBar as the main window's menu
root.config(menu=menubar)

# Run the application's event loop
root.mainloop()

Explanation: - tk.Menu(root): Creates a menu bar. - file_menu = tk.Menu(menubar, tearoff=0): Creates a file menu and sets tearoff to 0 to allow it to detach from the menubar. - edit_menu = tk.Menu(menubar, tearoff=0): Creates an edit menu similar to the file menu. - file_menu.add_command(label="New", command=file_menu): Adds a "New" item to the file menu that prints a message when clicked. - menubar.add_cascade(label="File", menu=file_menu): Attaches the file menu to the menubar with the label "File". - root.config(menu=menubar): Sets the menubar as the main window's menu.

Example 8: Canvas Widget

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Canvas")

def draw_circle():
    canvas.create_oval(50, 50, 150, 150)

# Create a Canvas widget
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack()

# Create a button to draw a circle
draw_button = tk.Button(root, text="Draw Circle", command=draw_circle)
draw_button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.Canvas(root, width=200, height=200): Creates a canvas widget with a specified width and height. - canvas.create_oval(50, 50, 150, 150): Draws an oval (circle) on the canvas. - draw_button = tk.Button(root, text="Draw Circle", command=draw_circle): Creates a button that calls the draw_circle function when clicked.

Example 9: Text Widget

import tkinter as tk

# Create the main window
root = tk.Tk()
root.title("Text")

def insert_text():
    text.insert(tk.END, "Hello, World!")

# Create a Text widget
text = tk.Text(root)
text.pack()

# Create an Insert Text button
insert_button = tk.Button(root, text="Insert Text", command=insert_text)
insert_button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.Text(root): Creates a text widget. - text.insert(tk.END, "Hello, World!"): Inserts the string "Hello, World!" at the end of the text widget.

Example 10: File Dialog

import tkinter as tk
from tkinter import filedialog

def open_file():
    filename = filedialog.askopenfilename()
    if filename:
        print(f"Opened file: {filename}")

# Create the main window
root = tk.Tk()
root.title("File Dialog")

# Create an Open File button
open_button = tk.Button(root, text="Open File", command=open_file)
open_button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - filedialog.askopenfilename(): Opens a file dialog and returns the selected filename. - open_file(): Calls the askopenfilename function and prints the selected filename.

Example 11: Toplevel Dialog

import tkinter as tk

def show_dialog():
    top = tk.Toplevel(root)
    top.title("Toplevel Dialog")
    label = tk.Label(top, text="This is a toplevel dialog.")
    label.pack()

# Create the main window
root = tk.Tk()
root.title("Toplevel Dialog")

# Create an Show Dialog button
show_button = tk.Button(root, text="Show Dialog", command=show_dialog)
show_button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.Toplevel(root): Creates a toplevel window with the parent widget being the main window. - top.title("Toplevel Dialog"): Sets the title of the toplevel window. - label = tk.Label(top, text="This is a toplevel dialog."): Adds a label to the toplevel window.

Example 12: Progressbar Widget

import tkinter as tk
from tkinter import ttk

def update_progress():
    progress.config(value=progress['value'] + 10)
    if progress['value'] < 100:
        root.after(100, update_progress)

# Create the main window
root = tk.Tk()
root.title("Progressbar")

# Create a Progressbar widget
progress = ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate")
progress.pack()

# Create an Update Progress button
update_button = tk.Button(root, text="Update Progress", command=update_progress)
update_button.pack()

# Start the progress update loop
root.after(100, update_progress)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate"): Creates a horizontal progress bar with a specified length and in determinate mode. - progress.config(value=progress['value'] + 10): Updates the value of the progress bar by adding 10 to its current value. - root.after(100, update_progress): Schedules the update_progress function to be called after 100 milliseconds.

Example 13: Scale Widget

import tkinter as tk
from tkinter import ttk

def scale_changed(value):
    print(f"Scale changed to: {value}")

# Create the main window
root = tk.Tk()
root.title("Scale")

# Create a Scale widget
scale = ttk.Scale(root, from_=0, to=100, orient="horizontal", command=scale_changed)
scale.pack()

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Scale(root, from_=0, to=100, orient="horizontal", command=scale_changed): Creates a horizontal scale with values ranging from 0 to 100 and calls the scale_changed function whenever the value changes. - scale_changed(value): Prints the current value of the scale.

Example 14: Checkbutton Widget

import tkinter as tk
from tkinter import ttk

def check_button_clicked():
    if var.get() == 1:
        print("Check button is checked.")
    else:
        print("Check button is unchecked.")

# Create the main window
root = tk.Tk()
root.title("Checkbutton")

# Create a Checkbutton widget
var = tk.IntVar()
check_button = ttk.Checkbutton(root, text="Check Me", variable=var, command=check_button_clicked)
check_button.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.IntVar(): Creates a variable to store the state of the checkbutton. - ttk.Checkbutton(root, text="Check Me", variable=var): Creates a checkbutton with the specified text and variable. - on_check_button_click(): Sets the value of the checkbutton to 1 when it is clicked.

Example 15: Radiobutton Widget

import tkinter as tk

def radio_button_clicked():
    print(f"Radio button selected: {var.get()}")

# Create the main window
root = tk.Tk()
root.title("Radiobutton")

# Create a variable to store the selected value
var = tk.StringVar()

# Create Radiobuttons with different values and assign them to the variable
rad1 = tk.Radiobutton(root, text="Option 1", variable=var, value="option1", command=radio_button_clicked)
rad2 = tk.Radiobutton(root, text="Option 2", variable=var, value="option2", command=radio_button_clicked)
rad3 = tk.Radiobutton(root, text="Option 3", variable=var, value="option3", command=radio_button_clicked)

# Pack the Radiobuttons
rad1.pack()
rad2.pack()
rad3.pack()

# Run the application's event loop
root.mainloop()

Explanation: - tk.StringVar(): Creates a variable to store the selected value of the radiobutton group. - ttk.Radiobutton(root, text="Option 1", variable=var, value="option1"): Creates a radiobutton with the specified text and assigns it to the variable. The value associated with this radiobutton is "option1". - on_radio_button_click(value): Sets the selected value of the variable based on which radiobutton is clicked.

Example 16: Notebook Widget

import tkinter as tk
from tkinter import ttk

def add_tab():
    tab = ttk.Frame(notebook)
    notebook.add(tab, text=f"Tab {notebook.index(tab) + 1}")
    notebook.select(tab)

# Create the main window
root = tk.Tk()
root.title("Notebook")

# Create a Notebook widget
notebook = ttk.Notebook(root)

# Create tabs and add them to the notebook
for i in range(3):
    tab = ttk.Frame(notebook)
    notebook.add(tab, text=f"Tab {i + 1}")

# Define the command for adding a new tab
def on_add_tab():
    add_tab()

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Notebook(root): Creates a notebook widget that manages multiple tabs. - notebook.add(tab, text=f"Tab {tab.index(tab) + 1}"): Adds a new tab to the notebook with a generated title based on its index. - on_add_tab(): Calls the add_tab function to add a new tab each time it is clicked.

Example 17: Spinbox Widget

import tkinter as tk
from tkinter import ttk

def spinbox_changed(value):
    print(f"Spinbox changed to: {value}")

# Create the main window
root = tk.Tk()
root.title("Spinbox")

# Create a Spinbox widget with range and step
spinbox = ttk.Spinbox(root, from_=0, to=100, increment=5)
spinbox.pack()

# Define the command for when the spinbox value changes
def on_spinbox_change(value):
    spinbox.set(value)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Spinbox(root, from_=0, to=100, increment=5): Creates a spinbox with values ranging from 0 to 100 and increments in steps of 5. - on_spinbox_change(value): Sets the value of the spinbox based on its current value.

Example 18: Entry Widget

import tkinter as tk
from tkinter import ttk

def entry_changed(event):
    print(f"Entry changed to: {entry.get()}")

# Create the main window
root = tk.Tk()
root.title("Entry")

# Create an Entry widget with a placeholder text
entry = ttk.Entry(root, width=30)
entry.pack()

# Define the command for when the entry value changes
def on_entry_change(event):
    entry.delete(0, tk.END)  # Clear the entry field

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Entry(root, width=30): Creates an entry widget with a specified width and placeholder text. - on_entry_change(event): Deletes the current contents of the entry field whenever it is changed.

Example 19: Combobox Widget

import tkinter as tk
from tkinter import ttk

def combobox_changed(event):
    print(f"Combobox selected: {combobox.get()}")

# Create the main window
root = tk.Tk()
root.title("Combobox")

# Create a Combobox widget with options and assign them to the variable
options = ["Option 1", "Option 2", "Option 3"]
combobox = ttk.Combobox(root, values=options)
combobox.pack()

# Define the command for when an item is selected in the combobox
def on_combobox_change(event):
    print(f"Combobox selected: {combobox.get()}")

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Combobox(root, values=options): Creates a combobox with pre-defined options. - on_combobox_change(event): Prints the current selection of the combobox.

Example 20: Treeview Widget

import tkinter as tk
from tkinter import ttk

def treeview_selected(event):
    item = treeview.selection()[0]
    print(f"Selected item: {treeview.item(item, 'text')}")

# Create the main window
root = tk.Tk()
root.title("Treeview")

# Create a Treeview widget with columns and define column headings
treeview = ttk.Treeview(root)
treeview["columns"] = ("column1", "column2")
treeview.heading("#0", text="ID")
treeview.heading("column1", text="Name")
treeview.heading("column2", text="Age")
treeview.pack()

# Add some sample data to the Treeview
data = [("1", "Alice", "25"), ("2", "Bob", "30"), ("3", "Charlie", "35")]
for item in data:
    treeview.insert("", tk.END, values=item)

# Define the command for when an item is selected in the Treeview
def on_treeview_select(event):
    treeview_selected(event)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Treeview(root): Creates a treeview widget with columns and defines column headings. - treeview["columns"] = ("column1", "column2"): Specifies the column names for the Treeview. - treeview.heading("#0", text="ID") and treeview.heading("column1", text="Name") and treeview.heading("column2", text="Age"): Sets the titles for each column in the Treeview. - data = [("1", "Alice", "25"), ("2", "Bob", "30"), ("3", "Charlie", "35")]: Defines some sample data to populate the treeview. - treeview.insert("", tk.END, values=item): Inserts each item into the Treeview. - on_treeview_select(event) defines a function that prints the selected item in the Treeview.

Example 21: Scrollbar Widget

import tkinter as tk
from tkinter import ttk

def on_scrollbar_yevent(event):
    treeview.yview_moveto(event.delta / 30.0)

# Create the main window
root = tk.Tk()
root.title("Scrollbar")

# Create a Treeview widget with columns and define column headings
treeview = ttk.Treeview(root)
treeview["columns"] = ("column1", "column2")
treeview.heading("#0", text="ID")
treeview.heading("column1", text="Name")
treeview.heading("column2", text="Age")
treeview.pack(side=tk.LEFT, fill=tk.BOTH)

# Add some sample data to the Treeview
data = [("1", "Alice", "25"), ("2", "Bob", "30"), ("3", "Charlie", "35")]
for item in data:
    treeview.insert("", tk.END, values=item)

# Create a vertical scrollbar for the Treeview
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL)
scrollbar.pack(side=tk.LEFT, fill=tk.Y)
treeview.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=lambda event: on_scrollbar_yevent(event))

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Scrollbar(root, orient=tk.VERTICAL) creates a vertical scrollbar. - scrollbar.pack(side=tk.LEFT, fill=tk.Y) positions the scrollbar to the left and fills the space vertically within the window. - treeview.config(yscrollcommand=scrollbar.set) associates the Treeview's y-scrollbar with the scrollbar's set function. - scrollbar.config(command=lambda event: on_scrollbar_yevent(event)) sets the command of the scrollbar to a lambda function that adjusts the Treeview's scroll position based on the scrollwheel delta.

Example 22: Progressbar Widget

import tkinter as tk
from tkinter import ttk

def start_progressbar():
    progressbar.start(10)

# Create the main window
root = tk.Tk()
root.title("ProgressBar")

# Create a ProgressBar widget with a maximum value of 100 and initial position at 50%
progressbar = ttk.Progressbar(root, mode="indeterminate", length=200, maximum=100, value=50)
progressbar.pack(pady=20)

# Start the progress bar
progressbar.start(10)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Progressbar(root, mode="indeterminate", length=200, maximum=100, value=50) creates a progressbar widget with an indeterminate mode, a length of 200 pixels, a maximum value of 100, and an initial position at 50%. - progressbar.pack(pady=20) positions the progressbar with some padding from the top. - progressbar.start(10) starts the progress bar in an indeterminate mode, updating its position every 10 milliseconds.

Example 23: Menu Widget

import tkinter as tk
from tkinter import ttk

def on_menuitem_click(event):
    print(f"Clicked: {event.widget['text']}")

# Create the main window
root = tk.Tk()
root.title("Menu")

# Create a Menu widget with submenus and menuitems
menu = tk.Menu(root)
root.config(menu=menu)

file_menu = tk.Menu(menu, tearoff=0)
file_menu.add_command(label="Open", command=lambda: print("Opening file..."))
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.quit)
menu.add_cascade(label="File", menu=file_menu)

edit_menu = tk.Menu(menu, tearoff=0)
edit_menu.add_command(label="Cut", command=lambda: print("Cutting selection..."))
edit_menu.add_command(label="Copy", command=lambda: print("Copying selection..."))
edit_menu.add_command(label="Paste", command=lambda: print("Pasting selection..."))
menu.add_cascade(label="Edit", menu=edit_menu)

# Define the command for when a menu item is clicked
def on_menu_click(event):
    if event.widget.winfo_class() == "Menu":
        on_menuitem_click(event)

# Bind the on_menu_click function to all Menu widget events
root.bind_all("<ButtonRelease-1>", on_menu_click)

# Run the application's event loop
root.mainloop()

Explanation: - tk.Menu(root) creates a menu at the root of the application. - file_menu = tk.Menu(menu, tearoff=0) and edit_menu = tk.Menu(menu, tearoff=0) create submenus within the main menu. - file_menu.add_command(label="Open", command=lambda: print("Opening file...")), file_menu.add_separator(), file_menu.add_command(label="Exit", command=root.quit), and menu.add_cascade(label="File", menu=file_menu) add menu items to the "File" submenu. - edit_menu.add_command(label="Cut", command=lambda: print("Cutting selection...")), edit_menu.add_command(label="Copy", command=lambda: print("Copying selection...")), edit_menu.add_command(label="Paste", command=lambda: print("Pasting selection...")), and menu.add_cascade(label="Edit", menu=edit_menu) add menu items to the "Edit" submenu. - on_menuitem_click(event) defines a function that prints the clicked menu item's text. - root.bind_all("<ButtonRelease-1>", on_menu_click) binds the on_menu_click function to all button release events, allowing it to handle clicks anywhere within the application.

Example 24: Label Widget

import tkinter as tk
from tkinter import ttk

def update_label():
    label.config(text="New Text")

# Create the main window
root = tk.Tk()
root.title("Label")

# Create a Label widget with text and font
label = ttk.Label(root, text="Initial Text", font=("Arial", 12))
label.pack(pady=20)

# Create a Button widget to update the label's text
update_button = ttk.Button(root, text="Update Label", command=update_label)
update_button.pack(pady=10)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Label(root, text="Initial Text", font=("Arial", 12)) creates a label with initial text and Arial font size 12. - label.config(text="New Text") updates the label's text to "New Text". - update_button = ttk.Button(root, text="Update Label", command=update_label) creates a button that calls the update_label function when clicked. - The label is packed with some padding, and the update button is also packed with some padding.

Example 25: Entry Widget

import tkinter as tk
from tkinter import ttk

def on_entry_text_changed(event):
    print("Entry text changed:", entry.get())

# Create the main window
root = tk.Tk()
root.title("Entry")

# Create an Entry widget with default text and width
entry = ttk.Entry(root, text="Default Text", width=20)
entry.pack(pady=10)

# Define the function to handle changes in the entry's text
def on_entry_text_changed(event):
    print("Entry text changed:", entry.get())

# Bind the on_entry_text_changed function to the Entry widget's text change event
entry.bind("<KeyRelease>", on_entry_text_changed)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Entry(root, text="Default Text", width=20) creates an entry field with default text "Default Text" and a width of 20 characters. - The entry widget is packed with some padding. - def on_entry_text_changed(event): print("Entry text changed:", entry.get()) defines a function that prints the current text in the entry when it changes. - entry.bind("<KeyRelease>", on_entry_text_changed) binds the on_entry_text_changed function to the KeyRelease event of the entry widget, allowing it to respond to text changes.

Example 26: Listbox Widget

import tkinter as tk
from tkinter import ttk

def add_item_to_listbox():
    listbox.insert(tk.END, "New Item")

# Create the main window
root = tk.Tk()
root.title("Listbox")

# Create a Listbox widget with initial items and selection mode
listbox = tk.Listbox(root, height=5)  # Changed ttk.Listbox to tk.Listbox
listbox.insert(tk.END, "Item 1")
listbox.insert(tk.END, "Item 2")
listbox.insert(tk.END, "Item 3")
listbox.config(selectmode=tk.SINGLE)
listbox.pack(pady=10)

# Define the function to add an item to the listbox
def add_item_to_listbox():
    listbox.insert(tk.END, "New Item")

# Create a Button widget to add items to the listbox
add_button = ttk.Button(root, text="Add Item", command=add_item_to_listbox)
add_button.pack(pady=10)

# Run the application's event loop
root.mainloop()

Explanation: - ttk.Listbox(root, height=5) creates a listbox with 5 rows. - listbox.insert(tk.END, "Item 1", "Item 2", "Item 3") adds initial items to the listbox. - listbox.config(selectmode=tk.SINGLE) configures the listbox to allow single selection of items. - The listbox is packed with some padding. - def add_item_to_listbox(): listbox.insert(tk.END, "New Item") defines a function that adds a new item to the end of the listbox when called. - add_button = ttk.Button(root, text="Add Item", command=add_item_to_listbox) creates a button that calls the add_item_to_listbox function when clicked. - The add button is also packed with some padding.

Example 27: Radiobutton Widget

import tkinter as tk
from tkinter import ttk

def update_selected_option():
    selected_value = variable.get()
    print(f"Selected option: {selected_value}")

# Create the main window
root = tk.Tk()
root.title("Radiobutton")

# Create a StringVar to hold the selected value
variable = tk.StringVar()

# Create Radiobuttons with different options and associated values
radiobutton1 = ttk.Radiobutton(root, text="Option 1", variable=variable, value="1")
radiobutton2 = ttk.Radiobutton(root, text="Option 2", variable=variable, value="2")
radiobutton3 = ttk.Radiobutton(root, text="Option 3", variable=variable, value="3")

# Pack the Radiobuttons with some padding
radiobutton1.pack(pady=5)
radiobutton2.pack(pady=5)
radiobutton3.pack(pady=5)

# Define the function to update when a Radiobutton is selected
def update_selected_option():
    selected_value = variable.get()
    print(f"Selected option: {selected_value}")

# Create a Button widget to trigger the selection change
update_button = ttk.Button(root, text="Update Selection", command=update_selected_option)
update_button.pack(pady=10)

# Run the application's event loop
root.mainloop()

Explanation: - tk.StringVar() is used to hold the value of the selected option. - radiobutton1 = ttk.Radiobutton(root, text="Option 1", variable=variable, value="1") creates a Radiobutton with label "Option 1", associated with the StringVar, and value "1". - The same is done for Option 2 and Option 3. - All Radiobuttons are packed with some padding. - def update_selected_option(): selected_value = variable.get(); print(f"Selected option: {selected_value}") defines a function that retrieves the selected value from the StringVar and prints it when called. - update_button = ttk.Button(root, text="Update Selection", command=update_selected_option) creates a button that calls the update_selected_option function when clicked. - The update button is also packed with some padding.

Example 28: Combobox Widget

import tkinter as tk
from tkinter import ttk

def on_combobox_change(event):
    selected_item = combobox.get()
    print(f"Selected item: {selected_item}")

# Create the main window
root = tk.Tk()
root.title("Combobox")

# Define items to be displayed in the Combobox
items = ["Item 1", "Item 2", "Item 3"]

# Create a Combobox widget with initial value and list of items
combobox = ttk.Combobox(root, values=items)
combobox.set("Initial Item")
combobox.pack(pady=10)

# Define the function to handle changes in the selected item
def on_combobox_change(event):
    selected_item = combobox.get()
    print(f"Selected item: {selected_item}")

# Bind the on_combobox_change function to the Combobox widget's selection change event
combobox.bind("<<ComboboxSelected>>", on_combobox_change)

# Run the application's event loop
root.mainloop()

Explanation: - items = ["Item 1", "Item 2", "Item 3"] defines a list of items to be displayed in the Combobox. - combobox = ttk.Combobox(root, values=items) creates a combobox with these items and initial value set to "Initial Item". - The combobox is packed with some padding. - def on_combobox_change(event): selected_item = combobox.get(); print(f"Selected item: {selected_item}") defines a function that retrieves the selected item from the Combobox when it changes. - combobox.bind("<<ComboboxSelected>>", on_combobox_change) binds the on_combobox_change function to the selection change event of the combobox, allowing it to respond to changes in the selected item.

Example 29: Scale Widget

import tkinter as tk
from tkinter import ttk

def update_scale_value(event):
    scale_value = scale.get()
    print(f"Scale value: {scale_value}")

# Create the main window
root = tk.Tk()
root.title("Scale")

# Create a Scale widget with range from 0 to 100 and initial value
scale = ttk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL)
scale.set(50)
scale.pack(pady=10)

# Define the function to handle changes in the scale value
def update_scale_value(event):
    scale_value = scale.get()
    print(f"Scale value: {scale_value}")

# Bind the on_scale_value_change function to the Scale widget's value change event
scale.bind("<ButtonRelease-1>", update_scale_value)

# Run the application's event loop
root.mainloop()

Explanation: - scale = ttk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL) creates a scale with a range from 0 to 100 and initial value set to 50. - The scale is packed with some padding. - def update_scale_value(event): scale_value = scale.get(); print(f"Scale value: {scale_value}") defines a function that retrieves the current value of the scale when it changes. - scale.bind("<ButtonRelease-1>", update_scale_value) binds the update_scale_value function to the release of the mouse button on the scale, allowing it to respond to changes in the scale value.

Example 30: Entry Widget

import tkinter as tk
from tkinter import ttk

def update_entry_value(event):
    entry_value = entry.get()
    print(f"Entry value: {entry_value}")

# Create the main window
root = tk.Tk()
root.title("Entry")

# Create an Entry widget for user input
entry = ttk.Entry(root)
entry.pack(pady=10)

# Define the function to handle changes in the entry value
def update_entry_value(event):
    entry_value = entry.get()
    print(f"Entry value: {entry_value}")

# Bind the on_entry_value_change function to the Entry widget's content change event
entry.bind("<KeyRelease>", update_entry_value)

# Run the application's event loop
root.mainloop()

Explanation: - entry = ttk.Entry(root) creates an entry widget for user input. - The entry is packed with some padding. - def update_entry_value(event): entry_value = entry.get(); print(f"Entry value: {entry_value}") defines a function that retrieves the current text in the entry when it changes. - entry.bind("<KeyRelease>", update_entry_value) binds the update_entry_value function to the release of any key while typing in the entry, allowing it to respond to changes in the entry value. This ensures real-time updates.

Example 31: Messagebox Widget

import tkinter as tk
from tkinter import messagebox
from tkinter import ttk

def show_message():
    messagebox.showinfo("Information", "This is a simple message box.")

# Create the main window
root = tk.Tk()
root.title("Messagebox")

# Define a function to display a message box when button is clicked
def show_message():
    messagebox.showinfo("Information", "This is a simple message box.")

# Create a Button widget that triggers the message box
button = ttk.Button(root, text="Show Message", command=show_message)
button.pack(pady=10)

# Run the application's event loop
root.mainloop()

Explanation: - messagebox.showinfo("Information", "This is a simple message box.") displays an information message box with title "Information" and message "This is a simple message box." - The same method (showerror, askokcancel) can be used to show different types of message boxes: error, ask for confirmation, or ask for yes/no. - A Button widget is created that calls the show_message function when clicked, triggering the display of the messagebox.

Example 32: Progressbar Widget

import tkinter as tk
from tkinter import ttk

def update_progress():
    progress['value'] += 10  # Increase progress by 10%
    if progress['value'] >= 100:
        progress['value'] = 0  # Reset progress bar when it reaches 100%

# Create the main window
root = tk.Tk()
root.title("Progressbar")

# Define a function to update the progress of the progress bar
def update_progress():
    progress['value'] += 10  # Increase progress by 10%
    if progress['value'] >= 100:
        progress['value'] = 0  # Reset progress bar when it reaches 100%

# Create a Progressbar widget with initial value and range
progress = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200, mode='determinate')
progress['value'] = 0  # Set progress to 0%
progress.pack(pady=10)

# Define a button that triggers the update of the progress bar
update_button = ttk.Button(root, text="Update Progress", command=update_progress)
update_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - progress = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200) creates a horizontal progress bar with a length of 200 pixels and initial value set to 0%. - The progress bar is packed with some padding. - def update_progress(): progress['value'] += 10; if progress['value'] >= 100: progress['value'] = 0 defines a function that increments the progress by 10% and resets it to 0% when it reaches 100%, allowing for continuous cycling. - A Button widget is created that calls the update_progress function when clicked, triggering updates to the progress bar.

Example 33: Checkbutton Widget

import tkinter as tk
from tkinter import ttk

def toggle_checkbutton(event=None):
    if checkbutton_var.get():
        print("Checkbox is checked")
    else:
        print("Checkbox is unchecked")

# Create the main window
root = tk.Tk()
root.title("Checkbutton")

# Define a function to toggle the state of the checkbox
def toggle_checkbutton(event=None):
    if checkbutton_var.get():
        print("Checkbox is checked")
    else:
        print("Checkbox is unchecked")

# Create a Checkbutton widget with initial state being unchecked
checkbutton_var = tk.BooleanVar()
checkbutton = ttk.Checkbutton(root, text="Check me", variable=checkbutton_var)
checkbutton.pack(pady=5)

# Bind the toggle_checkbutton function to the change event of the checkbutton
checkbutton.bind("<ButtonRelease>", toggle_checkbutton)

# Run the application's event loop
root.mainloop()

Explanation: - checkbutton = ttk.Checkbutton(root, text="Check me", variable=checkbutton_var) creates a checkbox with text "Check me" and initializes its state as unchecked. - The checkbutton is packed with some padding. - def toggle_checkbutton(): if checkbutton_var.get(): print("Checkbox is checked"); else: print("Checkbox is unchecked") defines a function that checks the current state of the checkbox using checkbutton_var.get() and prints whether it is checked or unchecked. - A button that triggers the toggle_checkbutton function when clicked allows for real-time updates to the checkstate.

Example 34: Radiobutton Widget

import tkinter as tk
from tkinter import ttk

def select_radio(event=None):
    selected_option = radio_var.get()
    print(f"Selected option: {selected_option}")

# Create the main window
root = tk.Tk()
root.title("Radiobutton")

# Define a function to select the active radiobutton
def select_radio(event=None):
    selected_option = radio_var.get()
    print(f"Selected option: {selected_option}")

# Create a variable to store the currently selected option
radio_var = tk.StringVar()

# Create three Radiobutton widgets with different options and associate them with the same variable
option1 = ttk.Radiobutton(root, text="Option 1", value="1", variable=radio_var)
option2 = ttk.Radiobutton(root, text="Option 2", value="2", variable=radio_var)
option3 = ttk.Radiobutton(root, text="Option 3", value="3", variable=radio_var)

# Pack the Radiobutton widgets with some padding
option1.pack(pady=5)
option2.pack(pady=5)
option3.pack(pady=5)

# Bind the select_radio function to the change event of all radiobuttons
for option in [option1, option2, option3]:
    option.bind("<ButtonRelease>", select_radio)

# Run the application's event loop
root.mainloop()

Explanation: - radio_var = tk.StringVar() creates a variable that stores the current value of the selected radio button. - option1 = ttk.Radiobutton(root, text="Option 1", value="1", variable=radio_var) creates three Radio buttons with different options ("Option 1", "Option 2", "Option 3") and associates them with the same radio_var. - The Radiobutton widgets are packed with some padding. - def select_radio(): selected_option = radio_var.get(); print(f"Selected option: {selected_option}") defines a function that retrieves the current value of the selected radio button using radio_var.get() and prints it to the console. - Each radiobutton is bound to the select_radio function to trigger updates whenever a new radiobutton is selected.

Example 35: Combobox Widget

import tkinter as tk
from tkinter import ttk

def select_option(event):
    selected_option = combo_var.get()
    print(f"Selected option: {selected_option}")

# Create the main window
root = tk.Tk()
root.title("Combobox")

# Define a function to handle selection of an option from the combobox
def select_option(event):
    selected_option = combo_var.get()
    print(f"Selected option: {selected_option}")

# Create a Combobox widget with options "Apple", "Banana", and "Cherry"
combo_var = tk.StringVar()
combo_box = ttk.Combobox(root, textvariable=combo_var)
combo_box['values'] = ('Apple', 'Banana', 'Cherry')
combo_box.current(0)  # Set the default selection to "Apple"

# Pack the Combobox widget with some padding
combo_box.pack(pady=10)

# Bind the select_option function to the change event of the combobox
combo_box.bind('<<ComboboxSelected>>', select_option)

# Run the application's event loop
root.mainloop()

Explanation: - combo_var = tk.StringVar() creates a variable that stores the current value selected in the combobox. - combo_box = ttk.Combobox(root, textvariable=combo_var) creates a Combobox widget and associates it with the combo_var. - The combobox is packed with some padding and has pre-defined options ("Apple", "Banana", "Cherry") provided via the 'values' attribute. - combo_box.current(0) sets the default selection of the combobox to "Apple". - def select_option(): selected_option = combo_var.get(); print(f"Selected option: {selected_option}") defines a function that retrieves the current value selected in the combobox using combo_var.get() and prints it to the console. - The combobox is bound to the select_option function to trigger updates whenever an option is selected.

Example 36: Text Widget

import tkinter as tk
from tkinter import ttk

def insert_text():
    text_widget.insert(tk.END, "This is some inserted text.")

# Create the main window
root = tk.Tk()
root.title("Text Widget")

# Define a function to insert text into the Text widget
def insert_text():
    text_widget.insert(tk.END, "This is some inserted text.")

# Create a Text widget with initial text
text_widget = tk.Text(root)  # Changed ttk.Text to tk.Text
text_widget.insert(tk.END, "Initial text: Hello World!")

# Pack the Text widget with some padding
text_widget.pack(pady=10)

# Add a button to trigger text insertion
insert_button = tk.Button(root, text="Insert Text", command=insert_text)
insert_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - text_widget = ttk.Text(root) creates a Text widget. - text_widget.insert(tk.END, "Initial text: Hello World!") inserts some initial text into the widget at the end of its content area. - The Text widget is packed with some padding. - An insert_button button is created to trigger the insertion of additional text into the Text widget when clicked. The insert_text function is bound to this button's command attribute.

Example 37: Spinbox Widget

import tkinter as tk
from tkinter import ttk

def increment_value():
    current_value = int(spinbox_var.get())
    spinbox_var.set(current_value + 1)

# Create the main window
root = tk.Tk()
root.title("Spinbox")

# Define a function to increment the value in the Spinbox widget
def increment_value():
    current_value = int(spinbox_var.get())
    spinbox_var.set(current_value + 1)

# Create a Spinbox widget with initial value and range
spinbox_var = tk.StringVar()
spinbox = ttk.Spinbox(root, textvariable=spinbox_var, from_=0, to=10)
spinbox.pack(pady=5)

# Add buttons to increment or decrement the value in the Spinbox widget
increment_button = tk.Button(root, text="Increment", command=increment_value)
increment_button.pack(side=tk.LEFT, padx=5)
decrement_button = tk.Button(root, text="Decrement", command=lambda: spinbox_var.set(int(spinbox_var.get()) - 1))
decrement_button.pack(side=tk.RIGHT, padx=5)

# Run the application's event loop
root.mainloop()

Explanation: - spinbox_var = tk.StringVar() creates a variable that stores the current value of the Spinbox widget. - spinbox = ttk.Spinbox(root, textvariable=spinbox_var, from_=0, to=10) creates a Spinbox widget with an initial value of 0 and range from 0 to 10. - The Spinbox widget is packed with some padding. - Two buttons are added: one to increment the value in the Spinbox when clicked and another to decrement it. Both buttons call their respective functions increment_value and a lambda function that decrements the value by subtracting 1 from its current integer value.

Example 38: Listbox Widget

import tkinter as tk
from tkinter import ttk

def select_item():
    selected_index = listbox.curselection()
    if selected_index:
        print(f"Selected item: {listbox.get(selected_index[0])}")

# Create the main window
root = tk.Tk()
root.title("Listbox")

# Define a function to handle selection of an item in the Listbox widget
def select_item():
    selected_index = listbox.curselection()
    if selected_index:
        print(f"Selected item: {listbox.get(selected_index[0])}")

# Create a Listbox widget with multiple options
options = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']
listbox = tk.Listbox(root)
for option in options:
    listbox.insert(tk.END, option)

# Pack the Listbox widget with some padding
listbox.pack(pady=10)

# Add a button to trigger item selection
select_button = tk.Button(root, text="Select Item", command=select_item)
select_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - listbox = tk.Listbox(root) creates a Listbox widget. - The options for the Listbox are defined in a list called options. - Each option is inserted into the Listbox using the insert method, with tk.END indicating the end of the list. This results in a dropdown menu where users can select an item from the available options. - The Listbox widget is packed with some padding and has multiple selection enabled (as shown by the presence of the curselection() method). - A select_button button is created to trigger the selection of an item from the Listbox when clicked. The select_item function retrieves and prints the selected item.

Example 39: Progressbar Widget

import tkinter as tk
from tkinter import ttk

def update_progress():
    progress_var.set(progress_var.get() + 10)
    if progress_var.get() >= 100:
        progress_var.set(0)

# Create the main window
root = tk.Tk()
root.title("Progressbar")

# Define a function to update the Progressbar widget
def update_progress():
    progress_var.set(progress_var.get() + 10)
    if progress_var.get() >= 100:
        progress_var.set(0)

# Create a Progressbar widget with initial value and range
progress_var = tk.IntVar()
progressbar = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200, mode='determinate', variable=progress_var)
progressbar.pack(pady=10)

# Add a button to trigger progressbar update
update_button = tk.Button(root, text="Update Progress", command=update_progress)
update_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - progress_var = tk.IntVar() creates a variable that stores the current value of the Progressbar widget. - progressbar = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200, mode='determinate', variable=progress_var) creates a horizontal progressbar with an initial value of 0 and range from 0 to 100. - The Progressbar widget is packed with some padding and set to a 'determinate' mode, meaning it will automatically adjust its length based on the current value. - An update_button button is created to trigger the progressbar update when clicked. The update_progress function increments the progress by 10 each time it is called, resetting to 0 after reaching 100.

Example 40: Entry Widget

import tkinter as tk
from tkinter import ttk

def get_entry_value():
    print("Entry widget value:", entry_var.get())

# Create the main window
root = tk.Tk()
root.title("Entry Widget")

# Define a function to retrieve the value from the Entry widget
def get_entry_value():
    print("Entry widget value:", entry_var.get())

# Create an Entry widget with initial text and placeholder text
entry_var = tk.StringVar()
entry_widget = ttk.Entry(root, textvariable=entry_var, placeholder="Enter some text")
entry_widget.pack(pady=10)

# Add a button to trigger retrieval of the Entry widget's value
get_button = tk.Button(root, text="Get Value", command=get_entry_value)
get_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - entry_var = tk.StringVar() creates a variable that stores the current value of the Entry widget. - entry_widget = ttk.Entry(root, textvariable=entry_var, placeholder="Enter some text") creates an Entry widget with an initial placeholder text and sets its text to the value stored in entry_var. - The Entry widget is packed with some padding and includes a default placeholder text which disappears when input is entered. - A get_button button is created to trigger the retrieval of the Entry widget's current value when clicked. The get_entry_value function retrieves and prints the current text value from the Entry widget.

Example 41: Label Widget

import tkinter as tk
from tkinter import ttk

def change_label_text():
    label_var.set("Text has been changed!")

# Create the main window
root = tk.Tk()
root.title("Label Widget")

# Define a function to change the text of the Label widget
def change_label_text():
    label_var.set("Text has been changed!")

# Create a Label widget with initial text
label_var = tk.StringVar(value="Initial Text")
label_widget = ttk.Label(root, textvariable=label_var)
label_widget.pack(pady=10)

# Add a button to trigger change of the Label widget's text
change_button = tk.Button(root, text="Change Text", command=change_label_text)
change_button.pack(pady=5)

# Run the application's event loop
root.mainloop()

Explanation: - label_var = tk.StringVar(value="Initial Text") creates a variable that stores the current text of the Label widget. - label_widget = ttk.Label(root, textvariable=label_var) creates a Label widget with an initial text set to the value stored in label_var. - The Label widget is packed with some padding and initially displays "Initial Text". - A change_button button is created to trigger the change of the Label widget's text when clicked. The change_label_text function updates label_var to a new string, which causes the Label widget to display the updated text.

Example 42: Button Widget

import tkinter as tk
from tkinter import ttk

def button_clicked():
    print("Button has been clicked!")

# Create the main window
root = tk.Tk()
root.title("Button Widget")

# Define a function that is called when the Button widget is clicked
def button_clicked():
    print("Button has been clicked!")

# Create a Button widget with initial text
button_widget = ttk.Button(root, text="Click Me")
button_widget.pack(pady=10)

# Add an event handler to trigger the button_click function on button click
button_widget.bind("<Button-1>", lambda event: button_clicked())

# Run the application's event loop
root.mainloop()

Explanation: - button_widget = ttk.Button(root, text="Click Me") creates a Button widget with an initial text label "Click Me". - The Button widget is packed with some padding. - An <Button-1> event handler is added to the button widget using the bind method. This handler calls the button_clicked function when the Button widget is clicked.

Example 43: Frame Widget

import tkinter as tk
from tkinter import ttk

def frame_action():
    print("Frame has been activated!")

# Create the main window
root = tk.Tk()
root.title("Frame Widget")

# Define a function that is called when the Frame widget is activated
def frame_action():
    print("Frame has been activated!")

# Create a Frame widget
frame_widget = ttk.Frame(root, relief=tk.SOLID)
frame_widget.pack(pady=10)

# Add an event handler to trigger the frame_action function on frame activation
frame_widget.bind("<Enter>", lambda event: frame_action())

# Run the application's event loop
root.mainloop()

Explanation: - frame_widget = ttk.Frame(root, relief=tk.SOLID) creates a Frame widget with a solid border. - The Frame widget is packed with some padding. - An <Enter> event handler is added to the frame widget using the bind method. This handler calls the frame_action function when the mouse enters the Frame widget area.

Example 44: Menu Widget

import tkinter as tk
from tkinter import ttk

def menu_option_selected(event):
    selected_menu = event.widget.cget("text")
    print(f"Selected option: {selected_menu}")

# Create the main window
root = tk.Tk()
root.title("Menu Widget")

# Define a function that is called when a menu option is selected
def menu_option_selected(event):
    selected_menu = event.widget.cget("text")
    print(f"Selected option: {selected_menu}")

# Create a Menu widget with submenus
menu_widget = tk.Menu(root)  # Changed from ttk.Menu to tk.Menu
file_menu = tk.Menu(menu_widget, tearoff=0)
file_menu.add_command(label="New", command=lambda: print("New file created"))
file_menu.add_command(label="Open", command=lambda: print("File opened"))
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.quit)

edit_menu = tk.Menu(menu_widget, tearoff=0)
edit_menu.add_command(label="Cut", command=lambda: print("Text cut"))
edit_menu.add_command(label="Copy", command=lambda: print("Text copied"))

menu_widget.add_cascade(label="File", menu=file_menu)
menu_widget.add_cascade(label="Edit", menu=edit_menu)

# Attach the Menu widget to the root window
root.config(menu=menu_widget)

# Run the application's event loop
root.mainloop()

Explanation: - menu_widget = ttk.Menu(root) creates a top-level menu widget. - Two submenus, "File" and "Edit", are created using the Menu class. - Commands within each submenu are added using the add_command method. Each command is associated with a lambda function that prints an appropriate message when called. - The submenus are attached to their respective parent menus using the add_cascade method. - The top-level menu widget is attached to the root window using the config method.

Example 45: Checkbutton Widget

import tkinter as tk
from tkinter import ttk

def checkbutton_toggled():
    state = check_var.get()
    print(f"Checkbutton state: {'checked' if state else 'unchecked'}")

# Create the main window
root = tk.Tk()
root.title("Checkbutton Widget")

# Define a function that is called when the Checkbutton widget toggles
def checkbutton_toggled():
    state = check_var.get()
    print(f"Checkbutton state: {'checked' if state else 'unchecked'}")

# Create a variable to track the state of the Checkbutton
check_var = tk.IntVar()

# Create a Checkbutton widget
check_button = ttk.Checkbutton(root, text="Enable Feature", variable=check_var)
check_button.pack(pady=10)

# Bind the checkbutton_toggled function to the Checkbutton widget's toggle event
check_button.bind("<ButtonRelease>", lambda event: checkbutton_toggled())

# Run the application's event loop
root.mainloop()

Explanation: - check_button = ttk.Checkbutton(root, text="Enable Feature") creates a Checkbutton widget with the label "Enable Feature". - The Checkbutton widget is packed with some padding. - A <ButtonRelease> event handler is added to the checkbutton using the bind method. This handler calls the checkbutton_toggled function whenever the Checkbutton widget is toggled (i.e., when the mouse button is released after clicking it).

Example 46: Radiobutton Widget

import tkinter as tk
from tkinter import ttk

def radiobutton_selected(radio_button):
    selected_option = radio_button.cget("text")
    print(f"Selected option: {selected_option}")

# Create the main window
root = tk.Tk()
root.title("Radiobutton Widget")

# Create Radiobutton widgets with different options
option1_var = tk.StringVar(value="Option 1")
radio_button1 = ttk.Radiobutton(root, text="Option 1", variable=option1_var)
option2_var = tk.StringVar(value="Option 2")
radio_button2 = ttk.Radiobutton(root, text="Option 2", variable=option2_var)

# Pack the Radiobutton widgets
radio_button1.pack(pady=5)
radio_button2.pack(pady=5)

# Bind the radiobutton_selected function to the selected option event for each Radiobutton widget
radio_button1.bind("<ButtonRelease>", lambda event: radiobutton_selected(radio_button1))
radio_button2.bind("<ButtonRelease>", lambda event: radiobutton_selected(radio_button2))

# Run the application's event loop
root.mainloop()

Explanation: - option1_var = tk.StringVar(value="Option 1") creates a StringVar variable to store the current selected option. - radio_button1 = ttk.Radiobutton(root, text="Option 1", variable=option1_var) creates a Radiobutton widget with the label "Option 1" and associates it with the option1_var. - option2_var = tk.StringVar(value="Option 2") creates another StringVar variable to store the current selected option. - radio_button2 = ttk.Radiobutton(root, text="Option 2", variable=option2_var) creates a Radiobutton widget with the label "Option 2" and associates it with the option2_var. - Both Radiobutton widgets are packed with some padding. - <ButtonRelease> event handlers are added to each Radiobutton widget using the bind method. These handlers call the radiobutton_selected function whenever a Radiobutton widget is selected.

Example 47: Scrollbar Widget

import tkinter as tk
from tkinter import ttk

def scrollbar_scrolled(event):
    print("Scrollbar scrolled")

# Create the main window
root = tk.Tk()
root.title("Scrollbar Widget")

# Define a function that is called when the Scrollbar widget is scrolled
def scrollbar_scrolled(event):
    print("Scrollbar scrolled")

# Create a Text widget and a Scrollbar widget
text_widget = tk.Text(root, width=30, height=10)
scrollbar = ttk.Scrollbar(root)

# Pack the widgets in a grid layout with both the widget and the scrollbar side by side
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
text_widget.grid(row=0, column=0, sticky=tk.NSEW)
scrollbar.grid(row=0, column=1, sticky=tk.NS)

# Configure the Scrollbar widget to control the Text widget
scrollbar.config(command=text_widget.yview)
text_widget.config(yscrollcommand=scrollbar.set)

# Bind the scrollbar_scrolled function to the Scrollbar widget's event
scrollbar.bind("<MouseWheel>", lambda event: scrollbar_scrolled(event))
scrollbar.bind("<Button-4>", lambda event: scrollbar_scrolled(event))
scrollbar.bind("<Button-5>", lambda event: scrollbar_scrolled(event))

# Run the application's event loop
root.mainloop()

Explanation: - text_widget = tk.Text(root, width=30, height=10) creates a Text widget with 30 characters wide and 10 lines high. - scrollbar = ttk.Scrollbar(root) creates a Scrollbar widget. - The widgets are packed in a grid layout using the grid method. The Text widget is placed in column 0, and the Scrollbar widget is placed in column 1. - Both columns are set to expand when the window is resized, allowing for both widgets to be scrolled independently. - The Scrollbar widget is configured to control the vertical scrolling of the Text widget using the command and yscrollcommand methods. - A <Scroll> event handler is added to the Scrollbar widget to call the scrollbar_scrolled function whenever the scrollbar is scrolled.

Example 48: Entry Widget

import tkinter as tk
from tkinter import ttk

def entry_typed(event):
    print("Entry typed")

# Create the main window
root = tk.Tk()
root.title("Entry Widget")

# Define a function that is called when text is typed into the Entry widget
def entry_typed(event):
    print("Entry typed")

# Create an Entry widget and a label to display input
entry = ttk.Entry(root)
label = tk.Label(root, text="Type something:")

# Pack the widgets in a grid layout with the label above the entry
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
label.grid(row=0, column=0, sticky=tk.W)
entry.grid(row=1, column=0, sticky=tk.NSEW)

# Bind the entry_typed function to the Entry widget's event
entry.bind("<KeyRelease>", lambda event: entry_typed(event))

# Run the application's event loop
root.mainloop()

Explanation: - entry = ttk.Entry(root) creates an Entry widget. - label = tk.Label(root, text="Type something:") creates a label to display the prompt "Type something:". - The widgets are packed in a grid layout using the grid method. The label is placed above the entry widget. - The <KeyRelease> event handler is added to the Entry widget to call the entry_typed function whenever text is typed into the entry.

Example 49: Listbox Widget

import tkinter as tk
from tkinter import ttk

def listbox_selected(event):
    selected_item = listbox.get(listbox.curselection())
    print(f"Selected item: {selected_item}")

# Create the main window
root = tk.Tk()
root.title("Listbox Widget")

# Define a function that is called when an item in the Listbox widget is selected
def listbox_selected(event):
    selected_item = listbox.get(listbox.curselection())
    print(f"Selected item: {selected_item}")

# Create a Listbox widget with options to select from
listbox_options = ["Option 1", "Option 2", "Option 3"]
listbox = tk.Listbox(root, height=len(listbox_options))  # Changed ttk.Listbox to tk.Listbox

# Populate the Listbox widget with items
for option in listbox_options:
    listbox.insert(tk.END, option)

# Pack the Listbox widget
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
listbox.pack(pady=5)

# Bind the listbox_selected function to the Listbox widget's selection event
listbox.bind("<<ListboxSelect>>", lambda event: listbox_selected(event))

# Run the application's event loop
root.mainloop()

Explanation: - listbox_options = ["Option 1", "Option 2", "Option 3"] creates a list of options to populate the Listbox widget. - listbox = ttk.Listbox(root, height=len(listbox_options)) creates a Listbox widget with the specified number of lines. - The items from listbox_options are inserted into the Listbox widget using the insert method. - The Listbox widget is packed in the main window using the grid method. - A <ListboxSelect>> event handler is added to the Listbox widget to call the listbox_selected function whenever an item is selected.

Example 50: Treeview Widget

import tkinter as tk
from tkinter import ttk

def treeview_clicked(event):
    selected_items = treeview.selection()
    if selected_items:
        item = selected_items[0]
        if treeview.item(item, "values"):
            print(f"Clicked on {treeview.item(item, 'values')}")
        else:
            print(f"Clicked on {treeview.item(item, 'text')}")
    else:
        print("No item selected")

# Create the main window
root = tk.Tk()
root.title("Treeview Widget")

# Define a function that is called when an item in the Treeview widget is clicked
def treeview_clicked(event):
    selected_items = treeview.selection()
    if selected_items:
        item = selected_items[0]
        if treeview.item(item, "values"):
            print(f"Clicked on {treeview.item(item, 'values')}")
        else:
            print(f"Clicked on {treeview.item(item, 'text')}")
    else:
        print("No item selected")

# Create a Treeview widget with columns
treeview_columns = ("Name", "Age")
treeview = ttk.Treeview(root, columns=treeview_columns)

# Define column headings
treeview.heading("Name", text="Name")
treeview.heading("Age", text="Age")

# Insert some sample data into the Treeview widget
treeview.insert("", tk.END, values=("Alice", 30))
treeview.insert("", tk.END, values=("Bob", 25))
treeview.insert("", tk.END, values=("Charlie", 40))

# Pack the Treeview widget
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
treeview.pack(pady=5)

# Bind the treeview_clicked function to the Treeview widget's click event
treeview.bind("<Button-1>", lambda event: treeview_clicked(event))

# Run the application's event loop
root.mainloop()

Explanation: - treeview_columns = ("Name", "Age") creates a list of column names for the Treeview widget. - treeview = ttk.Treeview(root, columns=treeview_columns) creates a Treeview widget with the specified columns. - The column headings are defined using the heading method. - Some sample data is inserted into the Treeview widget using the insert method. - The Treeview widget is packed in the main window using the grid method. - A <Button-1> event handler is added to the Treeview widget to call the treeview_clicked function whenever an item is clicked. This handler checks if there are values associated with the selected item and prints them, or just the text if there are no values.

These examples demonstrate a variety of tkinter widgets and their functionalities, including buttons, frames, labels, entry fields, listboxes, treeviews, and more. Each example includes a detailed explanation of how to create and use the widget, as well as any additional features or options that can be customized. These snippets should provide a solid foundation for building complex GUI applications using tkinter in Python.

tkinter.scrolledtext - Scrolled Text Widget.md

tkinter.scrolledtext - Scrolled Text Widget

The scrolledtext module in Python's standard library provides a ScrolledText widget, which is similar to the Text widget but with added support for scrolling. This widget is particularly useful when you need a text entry area that can handle large amounts of text and provide easy navigation through it.

Below are comprehensive examples for each functionality provided by the scrolledtext module:

Example 1: Basic Scrolled Text Widget

import tkinter as tk
from tkinter import scrolledtext

def create_scrolled_text_window():
    # Create the main window
    root = tk.Tk()
    root.title("Basic Scrolled Text Widget")

    # Create a ScrolledText widget with fixed width and height
    st = scrolledtext.ScrolledText(root, width=40, height=10)
    st.pack(padx=10, pady=10)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This is a basic example of a ScrolledText widget.")

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
create_scrolled_text_window()

Example 2: Customizing Scrollbar Appearance

import tkinter as tk
from tkinter import scrolledtext

def customize_scrollbar():
    # Create the main window
    root = tk.Tk()
    root.title("Customized Scrolled Text Widget")

    # Configure the appearance of the scrollbar
    custom_scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL)
    custom_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

    # Use the scrollbar with a ScrolledText widget
    st = scrolledtext.ScrolledText(root, width=40, height=10, yscrollcommand=custom_scrollbar.set)
    st.pack(padx=10, pady=10)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This example demonstrates how to customize the scrollbar appearance.")

    # Configure the scrolling command for the scrollbar
    custom_scrollbar.config(command=st.yview)

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
customize_scrollbar()

Example 3: Handling Text Events

import tkinter as tk
from tkinter import scrolledtext, messagebox

def handle_text_events():
    # Create the main window
    root = tk.Tk()
    root.title("Text Event Handling")

    # Create a ScrolledText widget with a simple text event handler
    st = scrolledtext.ScrolledText(root, width=40, height=10)
    st.pack(padx=10, pady=10)

    # Define an event handler function
    def on_text_change(event):
        messagebox.showinfo("Event Details", f"Changed at position: {event.x}, {event.y}")

    # Bind the text change event to the ScrolledText widget
    st.bind("<KeyRelease>", on_text_change)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This example demonstrates how to handle text events.")

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
handle_text_events()

Example 4: Configuring Text Formatting

import tkinter as tk
from tkinter import scrolledtext, messagebox

def configure_text_formatting():
    # Create the main window
    root = tk.Tk()
    root.title("Text Formatting")

    # Create a ScrolledText widget with formatting options
    st = scrolledtext.ScrolledText(root, width=40, height=10)
    st.pack(padx=10, pady=10)

    # Define functions to apply different formatting styles
    def bold_text():
        st.tag_add("bold", "sel.first", "sel.last")

    def italic_text():
        st.tag_add("italic", "sel.first", "sel.last")

    def set_font(font_family, font_size):
        st.tag_config("customfont", font=(font_family, font_size))

    # Create buttons to apply formatting
    bold_button = tk.Button(root, text="Bold", command=bold_text)
    bold_button.pack(side=tk.LEFT, padx=5)

    italic_button = tk.Button(root, text="Italic", command=italic_text)
    italic_button.pack(side=tk.LEFT, padx=5)

    font_family_label = tk.Label(root, text="Font Family:")
    font_family_label.pack(side=tk.LEFT, padx=5)

    font_family_entry = tk.Entry(root, width=10)
    font_family_entry.pack(side=tk.LEFT, padx=5)

    font_size_label = tk.Label(root, text="Font Size:")
    font_size_label.pack(side=tk.LEFT, padx=5)

    font_size_entry = tk.Entry(root, width=5)
    font_size_entry.pack(side=tk.LEFT, padx=5)

    set_font_button = tk.Button(root, text="Set Font", command=lambda: set_font(font_family_entry.get(), int(font_size_entry.get())))
    set_font_button.pack(side=tk.LEFT, padx=5)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This example demonstrates how to configure text formatting.")

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
configure_text_formatting()

Example 5: Customizing Text Colors

import tkinter as tk
from tkinter import scrolledtext, messagebox

def customize_text_colors():
    # Create the main window
    root = tk.Tk()
    root.title("Custom Text Colors")

    # Create a ScrolledText widget with color customization
    st = scrolledtext.ScrolledText(root, width=40, height=10)
    st.pack(padx=10, pady=10)

    # Define functions to change text colors
    def set_red_color():
        st.tag_config("red", foreground="red")

    def set_green_color():
        st.tag_config("green", foreground="green")

    def set_blue_color():
        st.tag_config("blue", foreground="blue")

    # Create buttons to apply color changes
    red_button = tk.Button(root, text="Red", command=set_red_color)
    red_button.pack(side=tk.LEFT, padx=5)

    green_button = tk.Button(root, text="Green", command=set_green_color)
    green_button.pack(side=tk.LEFT, padx=5)

    blue_button = tk.Button(root, text="Blue", command=set_blue_color)
    blue_button.pack(side=tk.LEFT, padx=5)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This example demonstrates how to customize text colors.")

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
customize_text_colors()

Example 6: Handling Text Selection

import tkinter as tk
from tkinter import scrolledtext, messagebox

def handle_text_selection():
    # Create the main window
    root = tk.Tk()
    root.title("Text Selection")

    # Create a ScrolledText widget with selection handling
    st = scrolledtext.ScrolledText(root, width=40, height=10)
    st.pack(padx=10, pady=10)

    # Define functions to handle text selections
    def select_text():
        selected_text = st.get("sel.first", "sel.last")
        messagebox.showinfo("Selected Text", f"Selected text: {selected_text}")

    # Create a button to select text
    select_button = tk.Button(root, text="Select Text", command=select_text)
    select_button.pack(side=tk.LEFT, padx=5)

    # Insert some initial text into the widget
    st.insert(tk.INSERT, "This example demonstrates how to handle text selections.")

    # Start the GUI event loop
    root.mainloop()

# Call the function to create and display the window
handle_text_selection()

These examples cover various functionalities of the scrolledtext module, including basic usage, customizing widget appearance, handling text events, configuring text formatting, customizing text colors, and managing text selections. Each example is designed to be self-contained and can be run independently as a standalone script.

tkinter.tix - Extension widgets for Tk.md

tkinter.tix - Extension widgets for Tk

The tkinter.tix module provides extension widgets that are not part of the core Tkinter toolkit but add functionality like dialog boxes, progress bars, and more. Below are comprehensive and well-documented code examples for each feature in the tkinter.tix module.

1. Progress Bar

import tkinter as tk
from tkinter import ttk

def update_progress():
    current = int(progress_var.get())
    if current >= 100:
        progress_var.set(0)
    else:
        progress_var.set(current + 5)

root = tk.Tk()
root.title("Progress Bar Example")

# Create a variable to hold the progress value
progress_var = tk.IntVar(value=0)

# Create a progress bar widget
progress_bar = ttk.Progressbar(root, orient='horizontal', mode='determinate', length=200, variable=progress_var)
progress_bar.pack(pady=10)

# Create a button to update the progress
update_button = ttk.Button(root, text="Update Progress", command=update_progress)
update_button.pack()

root.mainloop()

2. Dialog Boxes

Example: Message Box

import tkinter as tk
from tkinter import messagebox
from tkinter import ttk  

def show_message():
    # Display a message box with an OK button
    response = messagebox.showinfo("Information", "This is a simple information message.")

    # You can also use other types like warning, error, etc.
    if response == 'ok':
        print("OK button clicked.")

root = tk.Tk()
root.title("Message Box Example")

# Create a button to show the message box
show_button = ttk.Button(root, text="Show Message", command=show_message)
show_button.pack(pady=10)

root.mainloop()

Example: Entry Dialog

import tkinter as tk
from tkinter import ttk
from tkinter import simpledialog


def get_name():
    # Get input from a dialog box with an OK and Cancel button
    name = simpledialog.askstring("Input", "Please enter your name:")

    if name:
        print(f"Hello, {name}!")


root = tk.Tk()
root.title("Entry Dialog Example")

# Create a button to show the entry dialog
show_button = ttk.Button(root, text="Get Name", command=get_name)
show_button.pack(pady=10)

root.mainloop()

3. Listbox

import tkinter as tk
from tkinter import scrolledtext, ttk

def add_item():
    item = listbox.get(listbox.curselection())
    if item:
        print(f"Item added: {item}")

def remove_item():
    item = listbox.get(listbox.curselection())
    if item:
        listbox.delete(listbox.curselection())

root = tk.Tk()
root.title("Listbox Example")

# Create a scrolled text area for the listbox
scrolled_text = scrolledtext.ScrolledText(root, width=40, height=10)
scrolled_text.pack(pady=10)

# Create a listbox widget
listbox = tk.Listbox(scrolled_text)
listbox.insert(tk.END, "Item 1", "Item 2", "Item 3")
listbox.pack()

# Create buttons to add and remove items from the listbox
add_button = ttk.Button(root, text="Add Selected Item", command=add_item)
add_button.pack(pady=5)

remove_button = ttk.Button(root, text="Remove Selected Item", command=remove_item)
remove_button.pack(pady=5)

root.mainloop()

4. Treeview

import tkinter as tk
from tkinter import scrolledtext, ttk

def select_item(event):
    item = tree.selection()[0]
    print(f"Selected item: {item}")

def add_item():
    item = listbox.get(listbox.curselection())
    if item:
        tree.insert("", "end", text=item)

root = tk.Tk()
root.title("Treeview Example")

# Create a scrolled text area
scrolled_text = scrolledtext.ScrolledText(root, width=40, height=10)
scrolled_text.pack(pady=10)

# Create a listbox widget to select items from
listbox = tk.Listbox(scrolled_text)
listbox.insert(tk.END, "Item 1", "Item 2", "Item 3")
listbox.pack()

# Create a treeview widget
tree = ttk.Treeview(root, columns=("column1",))
tree.heading("#0", text="Items")
tree.column("column1", width=100)
tree.insert("", "end", text="Root Node")
tree.pack(pady=10)

# Bind the selection event to a function
tree.bind("<<TreeviewSelect>>", select_item)

# Create buttons to add items to the treeview and select from the listbox
add_button = ttk.Button(root, text="Add Selected Item", command=add_item)
add_button.pack(pady=5)

root.mainloop()

5. Scrolled Text Area

import tkinter as tk
from tkinter import scrolledtext
from tkinter import ttk  # Add this import

def clear_text():
    text.delete("1.0", "end")

def insert_text(event):
    text.insert(tk.END, event.char)

root = tk.Tk()
root.title("Scrolled Text Area Example")

# Create a scrolled text area widget
text = scrolledtext.ScrolledText(root, width=40, height=10)
text.pack(pady=10)

# Bind the key press event to a function
text.bind("<Key>", insert_text)

# Create a button to clear the text in the scrolled text area
clear_button = ttk.Button(root, text="Clear Text", command=clear_text)
clear_button.pack(pady=5)

root.mainloop()

6. Dialog Box with Entry

import tkinter as tk
from tkinter import simpledialog
from tkinter import ttk  # Add this import


def get_email():
    # Get input from a dialog box with an OK and Cancel button
    email = simpledialog.askstring("Input", "Please enter your email:")

    if email:
        print(f"Email entered: {email}")


root = tk.Tk()
root.title("Dialog Box with Entry Example")

# Create a button to show the entry dialog
show_button = ttk.Button(root, text="Get Email", command=get_email)
show_button.pack(pady=10)

root.mainloop()

7. Option Menu

import tkinter as tk
from tkinter import ttk

def on_option_change(option):
    print(f"Option selected: {option}")

root = tk.Tk()
root.title("Option Menu Example")

# Create a variable to hold the selected option
selected_option = tk.StringVar()

# Create an option menu widget with options 'Apple', 'Banana', and 'Cherry'
option_menu = ttk.OptionMenu(root, selected_option, "Apple", "Banana", "Cherry")
option_menu.pack(pady=10)

# Bind a function to the selection event
option_menu.bind("<<ComboboxSelected>>", lambda event: on_option_change(selected_option.get()))

root.mainloop()

These examples demonstrate various functionalities provided by the tkinter.tix module, including progress bars, dialog boxes, listboxes, treeviews, scrolled text areas, and more. Each example is designed to be clear, concise, and follows best practices for Tkinter development.

tkinter.ttk - Tk themed widgets.md

tkinter.ttk - Tk themed widgets

The ttk (Themed Tk) module in the Python standard library provides a collection of high-level themed widgets that are designed to look and feel like those found in modern desktop applications. These widgets are based on the ttk toolkit, which is included with many window managers such as GTK+ and Qt. Below are comprehensive examples for each functionality available in the ttk module.

1. Creating a Basic Toplevel Window

import tkinter as tk
from tkinter import ttk

# Create the main window
root = tk.Tk()
root.title("Basic Toplevel Window")

# Create and pack a label widget
label = ttk.Label(root, text="Welcome to Tk themed widgets!")
label.pack(pady=10)

# Start the Tk event loop
root.mainloop()

2. Adding Buttons

import tkinter as tk
from tkinter import ttk

def button_click():
    print("Button was clicked!")

# Create the main window
root = tk.Tk()
root.title("Buttons Example")

# Create and pack a button widget
button = ttk.Button(root, text="Click Me", command=button_click)
button.pack(pady=10)

# Start the Tk event loop
root.mainloop()

3. Creating Entry Widgets

import tkinter as tk
from tkinter import ttk

def get_entry_value():
    value = entry.get()
    print(f"Entry Value: {value}")

# Create the main window
root = tk.Tk()
root.title("Entry Widget Example")

# Create and pack an entry widget
entry = ttk.Entry(root, width=30)
entry.pack(pady=10)

# Create a button to trigger the entry value retrieval
button = ttk.Button(root, text="Get Value", command=get_entry_value)
button.pack(pady=10)

# Start the Tk event loop
root.mainloop()

4. Using Checkbuttons

import tkinter as tk
from tkinter import ttk

def check_button_state():
    state = check_var.get()
    print(f"Check button is {'checked' if state else 'unchecked'}.")

# Create the main window
root = tk.Tk()
root.title("Checkbutton Example")

# Define a variable to store the checkbutton state
check_var = tk.BooleanVar()

# Create and pack a checkbutton widget
check_button = ttk.Checkbutton(root, text="Enable Functionality", variable=check_var)
check_button.pack(pady=10)

# Create a button to trigger the state retrieval
button = ttk.Button(root, text="Get State", command=check_button_state)
button.pack(pady=10)

# Start the Tk event loop
root.mainloop()

5. Using Radiobuttons

import tkinter as tk
from tkinter import ttk

def radio_button_click(value):
    print(f"Selected value: {value}")

# Create the main window
root = tk.Tk()
root.title("Radiobutton Example")

# Define variables to store the selected values
var = tk.StringVar()

# Create and pack radiobutton widgets
radio1 = ttk.Radiobutton(root, text="Option 1", variable=var, value="option1")
radio1.pack(pady=5)

radio2 = ttk.Radiobutton(root, text="Option 2", variable=var, value="option2")
radio2.pack(pady=5)

# Create a button to trigger the selected value retrieval
button = ttk.Button(root, text="Get Selection", command=lambda: radio_button_click(var.get()))
button.pack(pady=10)

# Start the Tk event loop
root.mainloop()

6. Using Comboboxes

import tkinter as tk
from tkinter import ttk

def combobox_select(event):
    selected_value = combobox.get()
    print(f"Selected value: {selected_value}")

# Create the main window
root = tk.Tk()
root.title("Combobox Example")

# Define options for the combobox
options = ["Option 1", "Option 2", "Option 3"]

# Create and pack a combobox widget
combobox = ttk.Combobox(root, values=options)
combobox.pack(pady=10)

# Bind an event to handle selection changes
combobox.bind("<<ComboboxSelected>>", combobox_select)

# Start the Tk event loop
root.mainloop()

7. Using Progress Bars

import tkinter as tk
from tkinter import ttk

def update_progress():
    progress_var.set(progress_var.get() + 10)
    if progress_var.get() >= 100:
        progress_bar.stop()

# Create the main window
root = tk.Tk()
root.title("Progress Bar Example")

# Define variables to store the progress bar value and state
progress_var = tk.IntVar(value=0)

# Create and pack a progress bar widget
progress_bar = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200, variable=progress_var)
progress_bar.pack(pady=10)

# Start the update function to simulate progress
root.after(500, update_progress)

# Start the Tk event loop
root.mainloop()

8. Using Scrolled Text Widgets

import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext  # Add this import

def add_text():
    text.insert(tk.END, "This is some additional text.\n")

# Create the main window
root = tk.Tk()
root.title("Scrolled Text Example")

# Define a frame to hold the scrolled text widget
frame = ttk.Frame(root)
frame.pack(pady=10)

# Create and pack a scrolledtext widget
text = scrolledtext.ScrolledText(frame, width=40, height=5)
text.insert(tk.END, "Hello, Tk themed widgets!\n")
text.pack(pady=10)

# Create a button to add more text
button = ttk.Button(root, text="Add Text", command=add_text)
button.pack(pady=10)

# Start the Tk event loop
root.mainloop()

9. Using Combobox with Multiple Selection

import tkinter as tk
from tkinter import ttk

def combo_select(event):
    selected_values = [var.get() for var in checkbox_vars if var.get()]
    print(f"Selected values: {selected_values}")

# Create the main window
root = tk.Tk()
root.title("Combobox with Multiple Selection Example")

# Define options for the combobox
options = ["Option 1", "Option 2", "Option 3"]

# Create and pack radiobuttons (checkboxes) corresponding to each option
checkbox_vars = [tk.BooleanVar() for _ in options]
for i, option in enumerate(options):
    ttk.Checkbutton(root, text=option, variable=checkbox_vars[i]).pack(pady=5)

# Create a combobox widget
combobox = ttk.Combobox(root, values=options)
combobox.pack(pady=10)

# Bind an event to handle selection changes
combobox.bind("<<ComboboxSelected>>", combo_select)

# Start the Tk event loop
root.mainloop()

10. Using Menus

import tkinter as tk
from tkinter import ttk

def menu_item_click(item):
    print(f"Menu item clicked: {item}")

# Create the main window
root = tk.Tk()
root.title("Menu Example")

# Define a function to create and configure menus
def create_menu():
    menubar = tk.Menu(root)
    root.config(menu=menubar)

    # File menu
    file_menu = tk.Menu(menubar, tearoff=0)
    file_menu.add_command(label="Open", command=lambda: menu_item_click("Open"))
    file_menu.add_command(label="Save", command=lambda: menu_item_click("Save"))
    file_menu.add_separator()
    file_menu.add_command(label="Exit", command=root.quit)
    menubar.add_cascade(label="File", menu=file_menu)

    # Edit menu
    edit_menu = tk.Menu(menubar, tearoff=0)
    edit_menu.add_command(label="Cut", command=lambda: menu_item_click("Cut"))
    edit_menu.add_command(label="Copy", command=lambda: menu_item_click("Copy"))
    edit_menu.add_command(label="Paste", command=lambda: menu_item_click("Paste"))
    menubar.add_cascade(label="Edit", menu=edit_menu)

# Call the function to create and configure menus
create_menu()

# Start the Tk event loop
root.mainloop()

These examples demonstrate various functionalities of the ttk module, including creating basic widgets like buttons, entry fields, checkboxes, radio buttons, comboboxes, progress bars, scrolled text widgets, and more. Each example includes comments to explain each step for clarity and is suitable for inclusion in official documentation or tutorials.

Importing Modules

importlib - The implementation of import.md

importlib - The implementation of import

The importlib module in Python provides a framework for dynamically importing modules and packages. It is particularly useful when you need to load modules at runtime or when dealing with dynamic imports based on configuration or user input.

Below are comprehensive examples demonstrating various functionalities provided by the importlib module:

1. Dynamically Importing a Module

# Example: Dynamically importing a module and using its functions

import importlib

# Dynamically import a module
module = importlib.import_module("math")

# Use a function from the imported module
result = module.sqrt(16)
print(f"The square root of 16 is: {result}")

# Importing a specific attribute from a module
from math import pi
print(f"Value of pi: {pi}")

2. Importing a Module with Aliasing

# Example: Importing a module and using it with an alias

import importlib

# Dynamically import a module with an alias
math_module = importlib.import_module("math", "m")

# Use a function from the imported module using its alias
result = m.sqrt(16)
print(f"The square root of 16 is: {result}")

3. Importing a Module Using importlib.util.module_from_spec

# Example: Dynamically importing a module using importlib.util

import importlib.util
import sys

# Create a spec for the module
spec = importlib.util.spec_from_file_location("my_module", "path/to/my_module.py")

# Create a module object from the spec
module = importlib.util.module_from_spec(spec)

# Executing the spec to define the module
spec.loader.exec_module(module)

# Accessing and using functions from the imported module
print(module.my_function())

4. Dynamically Importing a Submodule

# Example: Dynamically importing a submodule and accessing its attributes

import importlib

# Dynamically import a main module and then its submodule
main_module = importlib.import_module("my_project.main")
submodule = getattr(main_module, "submodule")

# Access an attribute from the submodule
print(submodule.my_attribute)

5. Importing Packages

# Example: Importing a package and accessing its submodules

import importlib

# Dynamically import a package
package = importlib.import_package("my_package")

# Access a submodule within the package
submodule = getattr(package, "submodule")

# Use a function from the submodule
result = submodule.my_function()
print(f"The result of my_function: {result}")

6. Handling Module Errors

# Example: Handling import errors using try-except blocks

import importlib

try:
    # Attempt to dynamically import an unknown module
    module = importlib.import_module("unknown_module")
except ImportError as e:
    print(f"Error importing module: {e}")

7. Importing Specific Attributes from a Package

# Example: Importing specific attributes from a package

import importlib

# Dynamically import the main module and then use specific attributes
main_module = importlib.import_package("my_package.main")

# Access multiple specific attributes
attr1, attr2 = getattr(main_module, "attr1"), getattr(main_module, "attr2")
print(f"Attr1: {attr1}, Attr2: {attr2}")

8. Using importlib.reload to Reload a Module

# Example: Reloading a module with changes

import importlib
import time

# Dynamically import a module
module = importlib.import_module("my_module")

# Modify the module's behavior
def new_function():
    return "This is a new function!"

setattr(module, "new_function", new_function)

# Print the original function
print(module.original_function())

# Reload the module to see changes
importlib.reload(module)

# Print the updated function after reload
print(module.new_function())

These examples cover a range of common use cases for the importlib module, demonstrating its flexibility and power in dynamically managing modules and packages in Python.

importlib.abc - Abstract base classes related to import

The importlib.abc module in Python provides an abstract base class interface for importing packages. This allows you to create custom importers and manage package metadata. Below are comprehensive code examples for each functionality provided by the importlib.abc module:

1. Importing Modules

Example: Implementing a Simple Importer

# Import necessary modules from importlib.abc
from importlib.abc import Loader, MetaPathFinder

class CustomLoader(Loader):
    def __init__(self, path):
        self.path = path

    # Define the method to load the module
    def create_module(self, spec):
        # Create a new module object
        return None

    # Define the method to exec the module code
    def exec_module(self, module):
        with open(self.path, 'r') as file:
            code = compile(file.read(), self.path, 'exec')
            exec(code, module.__dict__)

class CustomMetaPathFinder(MetaPathFinder):
    def find_spec(self, fullname, path=None, target=None):
        # Define the search logic
        if fullname == 'my_custom_module':
            return spec_from_loader(fullname, CustomLoader('path/to/my_module.py'))
        return None

# Set up the custom finder in sys.meta_path
sys.meta_path.append(CustomMetaPathFinder())

# Import the module using the custom loader
import my_custom_module

Explanation:

2. Loading Modules

Example: Using importlib.util.spec_from_file_location

# Import necessary modules from importlib.util
from importlib.util import spec_from_file_location, module_from_spec

# Define a file and its location
file_path = 'path/to/my_module.py'

# Create a specification for the module
spec = spec_from_file_location('my_module', file_path)

# Create an instance of the module using the specification
module = module_from_spec(spec)
spec.loader.exec_module(module)

# Now you can use the module
print(module.__name__)

Explanation:

3. Importing Packages

Example: Using importlib.util.spec_from_loader

# Import necessary modules from importlib.abc and importlib.util
from importlib.abc import Loader, MetaPathFinder
from importlib.util import spec_from_file_location, module_from_spec

class PackageLoader(Loader):
    def __init__(self, path):
        self.path = path

    # Define the method to create a package directory if needed
    def create_package(self, fullname):
        # Create a new directory for the package
        os.makedirs(fullname, exist_ok=True)
        return None

    # Define the method to exec the module code
    def exec_module(self, module):
        with open(self.path, 'r') as file:
            code = compile(file.read(), self.path, 'exec')
            exec(code, module.__dict__)

class PackageMetaPathFinder(MetaPathFinder):
    def find_spec(self, fullname, path=None, target=None):
        # Define the search logic
        if fullname == 'my_package':
            spec = spec_from_loader(fullname, PackageLoader('path/to/my_package/__init__.py'))
            return spec
        return None

# Set up the custom finder in sys.meta_path
sys.meta_path.append(PackageMetaPathFinder())

# Import the package using the custom loader
import my_package

Explanation:

Additional Resources

For more detailed documentation on the importlib.abc module and related functionality, you can refer to the official Python documentation.

importlib.metadata - Accessing the import metadata.md

importlib.metadata - Accessing the import metadata

The importlib.metadata module in Python is used to access metadata about installed packages and their dependencies. It provides a way to programmatically query package information, which can be useful for creating tools that interact with Python installations or manage dependencies dynamically.

Here are some code examples that demonstrate various functionalities of the importlib.metadata module:

  1. Accessing Package Information: ```python import importlib.metadata

# Get a list of all installed packages all_packages = importlib.metadata.available() print("All Installed Packages:", all_packages)

# Get details about a specific package package_details = importlib.metadata.version('requests') print("Version of requests:", package_details)

# Check if a package is installed is_installed = importlib.metadata.version('numpy') in all_packages print("Is numpy installed?", is_installed) ```

  1. Querying Package Metadata: ```python import importlib.metadata

# Get the description of a package description = importlib.metadata.description('beautifulsoup4') print("Description of beautifulsoup4:", description)

# Retrieve all versions of a package versions = list(importlib.metadata.versions('setuptools')) print("Versions of setuptools:", versions) ```

  1. Listing Files in an Installed Package: ```python import importlib.metadata

# List files in the 'requests' package files = list(importlib.metadata.files('requests')) for file in files: print(file) ```

  1. Checking for Required Dependencies: ```python import importlib.metadata

# Check if a package requires a specific dependency requires = importlib.metadata.requires('scipy') print("Dependencies of scipy:", requires)

# Verify if all dependencies are installed is_complete_installation = all([dep in all_packages for dep in requires]) print("Is the complete set of dependencies installed?", is_complete_installation) ```

  1. Handling Distribution Metadata: ```python import importlib.metadata

# Access distribution metadata from a package dist_info = importlib.metadata.distribution('pandas') print("Distribution Information:", dist_info)

# Retrieve information about the distribution's URL and maintainer distribution_url = dist_info.url maintainer = dist_info.maintainers[0].name print("Distribution URL:", distribution_url) print("Maintainer:", maintainer) ```

  1. Using Distribution Files: ```python import importlib.metadata

# Access files within a distribution's package directory package_files = list(dist_info.files(package='pandas')) for file in package_files: print(file) ```

  1. Querying Package Version Details: ```python import importlib.metadata

# Get detailed version information version_details = dist_info.version_details() print("Version Details:", version_details)

# Check if a specific version is available is_version_available = '1.2.3' in version_details.available_versions print("Is version 1.2.3 available?", is_version_available) ```

These examples cover basic operations such as listing installed packages, accessing package descriptions and versions, checking for dependencies, retrieving distribution metadata, and querying version details. Each example includes comments to explain the purpose of each section of the code.

importlib.resources - Resource reading using importers.md

importlib.resources - Resource reading using importers

The importlib.resources module provides a robust interface for accessing resources within a package or other importable resource. This module is particularly useful for managing resources like configuration files, data files, and other non-code artifacts that are included in Python packages.

Here are some comprehensive code examples demonstrating various functionalities of the importlib.resources module:

Example 1: Accessing a Text File

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/config.txt"

# Open and read the text file
with res.open_text(package_name, resource_path) as f:
    content = f.read()
    print("Content of config.txt:")
    print(content)

Example 2: Accessing a Binary File

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/data.bin"

# Open and read the binary file
with res.open_binary(package_name, resource_path) as f:
    data = f.read()
    print("Content of data.bin:")
    print(data)

Example 3: Accessing a Directory Containing Resources

import importlib.resources as res

# Define the package name and directory path
package_name = "example_package"
directory_path = "resources"

# List all files in the specified directory
with res.files(package_name).iterdir() as files:
    print("Files in resources directory:")
    for file in files:
        print(file.name)

Example 4: Accessing a Resource Using a Context Manager

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/another.txt"

# Use the context manager to open and read the file
content = res.read_text(package_name, resource_path)
print("Content of another.txt:")
print(content)

Example 5: Accessing a Resource Using files Method

import importlib.resources as res

# Define the package name
package_name = "example_package"

# Get the directory containing resources
resources_dir = res.files(package_name)

# List all files in the resources directory
for file_path in resources_dir.iterdir():
    print(file_path)

Example 6: Accessing a Resource Using open Method

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/another.txt"

# Open and read the file using the open method
with resources.open(package_name, resource_path) as f:
    content = f.read()
    print("Content of another.txt:")
    print(content)

Example 7: Accessing a Resource Using as_file Method

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/another.txt"

# Get the file object using as_file
file_obj = resources.as_file(res.files(package_name) / resource_path)

# Read the content of the file
content = file_obj.read()
print("Content of another.txt:")
print(content)

Example 8: Accessing a Resource Using exists Method

import importlib.resources as res

# Define the package name and resource path
package_name = "example_package"
resource_path = "resources/config.txt"

# Check if the resource exists
if res.exists(package_name, resource_path):
    print("Resource config.txt exists.")
else:
    print("Resource config.txt does not exist.")

Example 9: Accessing a Resource Using in_directory Method

import importlib.resources as res

# Define the package name and directory path
package_name = "example_package"
directory_path = "resources"

# Check if a specific file exists within a directory
if res.in_directory(package_name, directory_path) / "another.txt".exists():
    print("File another.txt exists in resources directory.")
else:
    print("File another.txt does not exist in resources directory.")

These examples demonstrate various ways to access and manage resources using the importlib.resources module. Each example is self-contained and includes comments for clarity. You can integrate these examples into your Python projects to efficiently handle resource files within packages or other importable resources.

importlib.util - Utility code for importers.md

importlib.util - Utility code for importers

The importlib.util module is part of the Python Standard Library, providing utilities to manage imports dynamically. Below are comprehensive code examples for various functionalities within this module:

1. Creating a Module Spec

import importlib.util

# Define the path to the file you want to import
file_path = '/path/to/your/module.py'

# Create a spec object using importlib.util.module_from_spec()
spec = importlib.util.spec_from_file_location('module_name', file_path)

# Create an instance of the module using importlib.util.module_from_spec()
my_module = importlib.util.module_from_spec(spec)

# Load the module
spec.loader.exec_module(my_module)

# Now you can use my_module as a regular Python module
print(my_module.my_function())

2. Specifying Attributes to Resolve

import importlib.util

# Define the path to the file and the attributes to resolve
file_path = '/path/to/your/module.py'
attributes = ['my_attribute']

# Create a spec object using importlib.util.module_from_spec()
spec = importlib.util.spec_from_file_location('module_name', file_path)

# Create an instance of the module using importlib.util.module_from_spec()
my_module = importlib.util.module_from_spec(spec)

# Set attributes that need to be resolved
spec.loader.exec_module(my_module, init_globals={'__all__': attributes})

# Now you can access my_attribute directly from the module
print(my_module.my_attribute)

3. Specifying a Custom Loader

import importlib.util

class MyLoader(importlib._bootstrap.ModuleSpec):
    def __init__(self, name, path, loader=None):
        super().__init__(name, path, loader)

    def find_spec(self, *args, **kwargs):
        # Implement custom logic to find the spec
        return super().find_spec(*args, **kwargs)

    def get_data(self, path):
        # Implement custom logic to read data
        with open(path, 'rb') as f:
            return f.read()

# Define the path to the file and specify a custom loader
file_path = '/path/to/your/module.py'
loader = MyLoader('module_name', file_path)

# Create a spec object using importlib.util.spec_from_file_location()
spec = importlib.util.module_from_spec(loader)

# Load the module
spec.loader.exec_module(spec.module)

# Now you can use spec.module as a regular Python module
print(spec.module.my_function())

4. Specifying Initialization Globals

import importlib.util

# Define the path to the file and specify initialization globals
file_path = '/path/to/your/module.py'
init_globals = {'__all__': ['my_public_attribute']}

# Create a spec object using importlib.util.module_from_spec()
spec = importlib.util.spec_from_file_location('module_name', file_path)

# Create an instance of the module using importlib.util.module_from_spec()
my_module = importlib.util.module_from_spec(spec)

# Set initialization globals
spec.loader.exec_module(my_module, init_globals=init_globals)

# Now you can access my_public_attribute directly from the module
print(my_module.my_public_attribute)

5. Specifying a Custom Module Class

import importlib.util

class MyModule:
    def __init__(self):
        self.my_variable = 'Hello, World!'

# Define the path to the file and specify the custom module class
file_path = '/path/to/your/module.py'
module_class = MyModule

# Create a spec object using importlib.util.module_from_spec()
spec = importlib.util.spec_from_file_location('module_name', file_path)

# Create an instance of the module using importlib.util.module_from_spec()
my_module = importlib.util.module_from_spec(spec, module_class)

# Load the module
spec.loader.exec_module(my_module)

# Now you can use my_module as a regular Python module with MyModule class
print(my_module.my_variable)

6. Loading a Module from Source

import importlib.util

# Define the source code of the module
source_code = """
def hello():
    return 'Hello, World!'
"""

# Create a spec object using importlib.util.spec_from_source()
spec = importlib.util.spec_from_loader('module_name', None)

# Create an instance of the module using importlib.util.module_from_spec()
my_module = importlib.util.module_from_spec(spec)

# Execute the source code
exec(source_code, my_module.__dict__)

# Now you can use my_module.hello() as a regular Python function
print(my_module.hello())

7. Loading a Module from a ZIP File

import importlib.util

# Define the path to the ZIP file and the module name within it
zip_file_path = '/path/to/your/module.zip'
module_name = 'subpackage.module'

# Create a spec object using importlib.util.spec_from_zip_location()
spec = importlib.util.spec_from_file_location(module_name, zip_file_path)

# Load the module from the ZIP file
importlib.util.module_from_spec(spec).load_module()

# Now you can use subpackage.module as a regular Python module
print(subpackage.module.my_function())

8. Loading a Module from a Remote URL

import importlib.util
import urllib.request

# Define the URL to the module file
url = 'https://example.com/path/to/module.py'

# Create a spec object using importlib.util.spec_from_url()
spec = importlib.util.spec_from_file_location('module_name', url)

# Load the module from the remote URL
my_module = importlib.util.module_from_spec(spec)
urllib.request.urlretrieve(url, 'temp_module.py')  # Download the file first
spec.loader.exec_module(my_module)

# Now you can use my_module as a regular Python module
print(my_module.my_function())

9. Specifying Initialization Path

import importlib.util

# Define the path to the directory containing the module
init_path = '/path/to/your/module'

# Create a spec object using importlib.util.spec_from_file_location()
spec = importlib.util.spec_from_file_location('module_name', init_path)

# Load the module from the specified directory
my_module = importlib.util.module_from_spec(spec)
my_module.__file__ = spec.origin  # Set the file path manually

# Now you can use my_module as a regular Python module
print(my_module.my_function())

These examples demonstrate various ways to use importlib.util for dynamic module loading in Python, covering different scenarios such as importing from files, URLs, and ZIP files, as well as specifying custom loaders, modules classes, and initialization paths.

modulefinder - Find modules used by a script.md

modulefinder - Find modules used by a script

The modulefinder module is part of Python's standard library, which provides tools to analyze and manage Python package installations. It allows you to find and analyze the imports in a Python script or module. Below are comprehensive code examples for various functionalities provided by the modulefinder module.

1. Basic Usage

Example: Finding Modules Used by a Script

import sys
from importlib.util import find_spec

# List of scripts to analyze
scripts = [
    "example_script.py",
]

for script in scripts:
    print(f"Analyzing {script}:")

    # Find the spec for the script module
    spec = find_spec(script)
    if spec is None:
        print(f"No module found for: {script}")
    else:
        print("Modules used by", script, "are:")

        # Walk through all imports in the spec
        for submodule in spec.submodules:
            if submodule.loader is not None:
                print(submodule.name)

Explanation:

2. Analyzing Modules with ModuleFinder

Example: Using ModuleFinder for Detailed Analysis

import sys
from importlib.util import find_spec
from modulefinder import ModuleFinder

# List of scripts to analyze
scripts = [
    "example_script.py",
]

for script in scripts:
    print(f"Analyzing {script}:")

    # Create a ModuleFinder instance
    finder = ModuleFinder()

    # Run the finder on the script
    finder.run_script(script)

    # Print found modules
    for mod in finder.modules.values():
        if mod.name not in sys.builtin_module_names:
            print(f"Module: {mod.name}, File: {mod.file}")

    # Print missing imports
    for mod_name, err in finder.errors.items():
        print(f"Error importing {mod_name}: {err}")

Explanation:

3. Customizing ModuleFinder

Example: Filtering Modules by Type

import sys
from importlib.util import find_spec
from modulefinder import ModuleFinder

# List of scripts to analyze
scripts = [
    "example_script.py",
]

for script in scripts:
    print(f"Analyzing {script}:")

    # Create a ModuleFinder instance and specify include standard library modules
    finder = ModuleFinder()
    finder.add_package_path("")

    # Run the finder on the script
    finder.run_script(script)

    # Filter out built-in modules
    found_modules = [mod.name for mod in finder.modules.values() if mod.file is not None]

    print("Modules used by", script, "are:")
    for module in found_modules:
        print(module)

Explanation:

4. Handling Large Scripts

Example: Analyzing a Large Script

import sys
from importlib.util import find_spec
from modulefinder import ModuleFinder

# List of large scripts to analyze
large_scripts = [
    "large_script.py",
]

for script in large_scripts:
    print(f"Analyzing {script}:")

    # Create a ModuleFinder instance
    finder = ModuleFinder()

    # Run the finder on the script
    finder.run_script(script)

    # Print total number of modules found
    total_modules = len(finder.modules)
    print(f"Total modules found in {script}: {total_modules}")

    # Print top 10 most imported modules
    import_counts = {mod.name: mod.importer.count for mod in finder.modules.values() if mod.importer is not None}
    top_10 = sorted(import_counts.items(), key=lambda x: x[1], reverse=True)[:10]

    print("\nTop 10 most imported modules:")
    for module, count in top_10:
        print(f"Module: {module}, Imports: {count}")

Explanation:

Conclusion

These examples demonstrate various functionalities of the modulefinder module, including basic usage, detailed analysis with ModuleFinder, customizing module searching, handling large scripts, and filtering out built-in modules. Each example includes comments to help understand the code's purpose and functionality.

pkgutil - Package extension utility.md

pkgutil - Package extension utility

pkgutil Module Examples

The pkgutil module provides a set of functions to explore and load Python packages, including finding modules, entry points, and other related resources.

Example 1: Find All Modules in a Package

import pkgutil

# Define the package name
package_name = 'example_package'

try:
    # Use pkgutil.iter_modules() to find all modules in the specified package
    for module_loader, module_name, ispkg in pkgutil.iter_modules([package_name]):
        if not ispkg:  # Skip packages
            print(f"Module found: {module_name}")

except ImportError as e:
    print(f"Error: {e}")

Explanation: - pkgutil.iter_modules(): This function returns an iterator yielding a tuple of three values for each module in the package. The first value is the importer, which may be None; the second is the module name; and the third indicates if it's a package. - Filtering Non-Packages: The example checks if ispkg is False to filter out non-package modules.

Example 2: Access a Module Dynamically

import pkgutil

# Define the package and module names
package_name = 'example_package'
module_name = 'example_module'

try:
    # Use importlib.import_module() to dynamically load the specified module
    module = pkgutil.import_module(f"{package_name}.{module_name}")

    # Access a function or variable from the module
    result = module.some_function()
    print(result)

except ImportError as e:
    print(f"Error: {e}")

Explanation: - pkgutil.import_module(): This function dynamically imports a module by name. - Example Use Case: The example accesses a function named some_function from the specified module.

Example 3: List Entry Points

import pkgutil
from importlib_metadata import entry_points

# Define the distribution name and group (e.g., 'console_scripts')
distribution_name = 'example_distribution'
group = 'console_scripts'

try:
    # Use entry_points() to list all entry points for a specified distribution and group
    entry_points_list = entry_points(distribution_name=distribution_name, group=group)

    for ep in entry_points_list:
        print(f"Entry point: {ep.name}, command: {ep.command}")

except ValueError as e:
    print(f"Error: {e}")

Explanation: - entry_points(): This function returns a list of EntryPoint objects from the distribution's metadata. - Example Use Case: The example lists all console script entry points for a given distribution.

Example 4: Find All Subpackages

import pkgutil

# Define the package name
package_name = 'example_package'

try:
    # Use pkgutil.iter_submodules() to find all submodules in the specified package
    for submodule_loader, submodule_name, ispkg in pkgutil.iter_modules([package_name]):
        if ispkg:  # Only include packages
            print(f"Subpackage found: {submodule_name}")

except ImportError as e:
    print(f"Error: {e}")

Explanation: - pkgutil.iter_submodules(): Similar to iter_modules(), but specifically returns submodules (i.e., packages). - Filtering Packages: The example filters for submodules by checking if ispkg is True.

Example 5: Find a Resource in a Package

import pkgutil

# Define the package and resource name
package_name = 'example_package'
resource_name = 'path/to/resource'

try:
    # Use pkgutil.get_data() to load a resource from the specified package
    data = pkgutil.get_data(package_name, resource_name)

    # Decode the bytes data into a string (assuming UTF-8 encoding)
    decoded_data = data.decode('utf-8')
    print(decoded_data)

except FileNotFoundError as e:
    print(f"Error: {e}")

Explanation: - pkgutil.get_data(): This function loads binary data from a package. - Example Use Case: The example loads and decodes a resource file (e.g., a configuration file) from the specified package.

These examples demonstrate various functionalities of the pkgutil module, including finding modules, accessing them dynamically, listing entry points, discovering subpackages, and retrieving resources. Each example is designed to be self-contained and clear, with comments explaining key steps.

runpy - Locate and run Python modules without importing them first.md

runpy - Locate and run Python modules without importing them first

The runpy module in Python provides functions to locate and execute Python scripts or modules, similar to how you would use the python -m command from the command line. This is particularly useful for running standalone scripts that are not imported as modules into other programs.

Here are some code examples demonstrating how to use the runpy module:

Example 1: Running a standalone Python script

Suppose you have a simple Python script named my_script.py with the following content:

# my_script.py
print("Hello, from my_script!")

You can run this script using runpy like this:

import runpy

# Run the standalone script
runpy.run_path('my_script.py')

Example 2: Running a module with command-line arguments

If your script uses command-line arguments, you can pass them to runpy using the args parameter:

import sys
import runpy

# Define the arguments to be passed to the script
args = ['my_script.py', '--arg1', 'value1']

# Run the module with command-line arguments
result = runpy.run_path('my_script.py', args=args)
print(result)

Example 3: Running a module with custom sys.argv

You can also customize the sys.argv list before running the script:

import sys
import runpy

# Original sys.argv
original_argv = sys.argv[:]

# Set new arguments for sys.argv
new_args = ['my_script.py', '--arg1', 'value1']

# Replace the original sys.argv with new ones
sys.argv = new_args

# Run the module
result = runpy.run_path('my_script.py')
print(result)

# Restore the original sys.argv
sys.argv = original_argv

Example 4: Running a script in a different working directory

You can change the current working directory before running the script:

import os
import runpy

# Original working directory
original_dir = os.getcwd()

# Set new working directory
new_dir = '/path/to/new/directory'
os.chdir(new_dir)

# Run the script
result = runpy.run_path('my_script.py')
print(result)

# Restore the original working directory
os.chdir(original_dir)

Example 5: Running a module with custom environment variables

You can set custom environment variables before running the script:

import os
import runpy

# Original environment variables
original_env = dict(os.environ)

# Set new environment variables
new_env = {'MY_VAR': 'value', 'OTHER_VAR': 'another_value'}
os.environ.update(new_env)

# Run the module
result = runpy.run_path('my_script.py')
print(result)

# Restore the original environment variables
os.environ.clear()
os.environ.update(original_env)

Example 6: Running a module with custom import paths

You can specify additional directories to search for modules when running the script:

import sys
import runpy

# Original import path
original_path = sys.path[:]

# Add new directory to the import path
new_dir = '/path/to/new/directory'
sys.path.append(new_dir)

# Run the module
result = runpy.run_path('my_script.py')
print(result)

# Restore the original import path
sys.path = original_path

These examples demonstrate various ways to use the runpy module to execute Python scripts and modules, providing flexibility for running standalone scripts, handling command-line arguments, customizing runtime environments, and more.

zipimport - Import modules from Zip archives.md

zipimport - Import modules from Zip archives

The zipimport module in Python allows you to import modules from a ZIP archive, which can be useful for distributing libraries as standalone ZIP files or for using pre-compiled shared objects. Here are comprehensive examples demonstrating various functionalities of the zipimport module.

Example 1: Importing a Module from a Zip Archive

import zipimport
import sys

# Specify the path to the ZIP file containing the module
zip_path = 'path/to/your/library.zip'
module_name = 'my_module'

# Find the zipimporter for the ZIP archive
zip_importer = zipimport.find_loader(module_name)

if not zip_importer:
    raise ImportError(f"Module {module_name} not found in {zip_path}")

# Create an instance of the importer and load the module
package_path, module_name = zip_importer.load_module(module_name).split('.', 1)
sys.modules[module_name] = importlib.import_module(package_path + '.' + module_name)

# Now you can use the imported module as usual
print(my_module.some_function())

Example 2: Using Zipimporter Directly

import zipimport
import sys

# Specify the path to the ZIP file containing the module
zip_path = 'path/to/your/library.zip'
module_name = 'my_module'

# Find the zipimporter for the ZIP archive
zip_importer = zipimport.find_loader(module_name)

if not zip_importer:
    raise ImportError(f"Module {module_name} not found in {zip_path}")

# Create an instance of the importer and load the module
package_path, module_name = zip_importer.load_module(module_name).split('.', 1)
sys.modules[module_name] = importlib.import_module(package_path + '.' + module_name)

# Now you can use the imported module as usual
print(my_module.some_function())

Example 3: Importing All Modules in a ZIP Archive

import zipimport
import sys

# Specify the path to the ZIP file containing the modules
zip_path = 'path/to/your/library.zip'

# Find all loaders for modules within the ZIP archive
loaders = [loader for loader, name in zipimport.find_modules('', zip_path)]

for loader, name in loaders:
    package_name, module_name = loader.load_module(name).split('.', 1)
    sys.modules[module_name] = importlib.import_module(package_name + '.' + module_name)

# Now you can use any imported modules as usual
print(my_module.some_function())

Example 4: Handling ZipFile Errors

import zipimport
import sys

# Specify the path to the ZIP file containing the module
zip_path = 'path/to/your/library.zip'
module_name = 'my_module'

# Find the zipimporter for the ZIP archive
zip_importer = zipimport.find_loader(module_name)

if not zip_importer:
    try:
        # Attempt to open the ZIP file directly and check if it contains the module
        with zipfile.ZipFile(zip_path) as zipf:
            if module_name in zipf.namelist():
                sys.path.append(zip_path)
                import my_module
                print(my_module.some_function())
            else:
                raise ImportError(f"Module {module_name} not found in {zip_path}")
    except zipfile.BadZipFile:
        print("The ZIP file is corrupted.")

# Import the module using a standard import statement

Example 5: Using zipimport with pkg_resources

from pkg_resources import resource_filename, ensure_resource

# Ensure that the ZIP file is extracted to a temporary directory
with ensure_resource(zip_path) as temp_dir:
    # Use zipimport directly on the extracted files
    import zipimport
    import sys

    # Specify the module name within the ZIP archive
    module_name = 'my_module'

    # Find the zipimporter for the module
    zip_importer = zipimport.find_loader(module_name, temp_dir)

    if not zip_importer:
        raise ImportError(f"Module {module_name} not found in {zip_path}")

    # Create an instance of the importer and load the module
    package_path, module_name = zip_importer.load_module(module_name).split('.', 1)
    sys.modules[module_name] = importlib.import_module(package_path + '.' + module_name)

# Now you can use the imported module as usual
print(my_module.some_function())

Notes:

These examples demonstrate how to use the zipimport module to dynamically import modules from ZIP archives in Python.

Internationalization

gettext - Multilingual internationalization services.md

gettext - Multilingual internationalization services

The gettext module is a powerful tool in Python for handling multilingual applications, allowing you to translate your application into different languages without needing to change the core logic of your program. Below are comprehensive examples demonstrating various functionalities of the gettext module:

Example 1: Basic Usage

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'  # Replace with the path to your locale files
lang_code = 'en_US.UTF-8'  # Replace with the desired language code (e.g., 'fr_FR')

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

# Use the translated text in a function
def say_hello():
    print(_('Hello, world!'))

say_hello()

Explanation: 1. Setup: The bindtextdomain and textdomain functions are used to specify the directory where the translation files are located and the domain of your application. 2. Translation Function: _ = gettext.gettext is defined to use for translating strings. 3. Usage: The say_hello function uses the translated text.

Example 2: Internationalizing Strings in a Script

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'fr_FR.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def main():
    # Print a welcome message with internationalized text
    print(_('Welcome to the Your Application'))

if __name__ == '__main__':
    main()

Explanation: - This script demonstrates how to use internationalized strings in a simple command-line application. - The gettext functions are used to ensure that the string 'Welcome to the Your Application' is translated into French.

Example 3: Loading and Using Translations from Multiple Files

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def say_hello():
    # Load additional translations from separate files
    with open(path + '/fr_FR/LC_MESSAGES/messages.po') as f:
        po = gettext.PoFile(f, encoding='utf-8')
        gettext._translations[lang_code] = po

    print(_('Hello, world!'))

say_hello()

Explanation: 1. Translation Domain: The gettext.bindtextdomain and gettext.textdomain functions are used to specify the directory and domain. 2. Additional Translations: Additional translations can be loaded from separate files using gettext.PoFile. This is useful for languages with extensive localization efforts.

Example 4: Internationalizing Error Messages

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def process_data(data):
    try:
        result = data / 0  # Simulate an error
    except ZeroDivisionError as e:
        # Use the translated error message
        print(_('An error occurred: %s') % str(e))

process_data(1)

Explanation: - This example demonstrates how to use internationalized error messages in a Python script. When an exception occurs, it is caught and a translation is used for displaying the error message.

Example 5: Localization of Application Menus

import gettext
from tkinter import Tk, Menu

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'fr_FR.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def create_menu():
    root = Tk()

    # Create a menu bar
    menubar = Menu(root)
    filemenu = Menu(menubar, tearoff=0)

    # Add translated options to the menu
    filemenu.add_command(label=_('Open'), command=root.quit)
    filemenu.add_separator()
    filemenu.add_command(label=_('Exit'), command=root.quit)

    # Add the file menu to the menubar
    menubar.add_cascade(label=_('File'), menu=filemenu)

    root.config(menu=menubar)

    root.mainloop()

create_menu()

Explanation: - This example shows how to integrate gettext into a Tkinter application to provide localized menu options. The Menu class from the tkinter module is used to create and manage menus.

Example 6: Customizing Message Formats

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'fr_FR.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def display_message():
    # Customize message format by using placeholders
    name = 'Alice'
    age = 30
    print(_('Your name is %s and you are %d years old.') % (name, age))

display_message()

Explanation: - This example demonstrates how to customize the format of translated messages using Python string formatting. Placeholders in the translation strings are replaced with actual values when the gettext functions are used.

Example 7: Using Plural Forms

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def count_items(items):
    plural_form = _('item') if len(items) == 1 else _('items')
    print(_('You have %d %s.') % (len(items), plural_form))

count_items([1, 2, 3])

Explanation: - This example demonstrates the use of plural forms in translations. The _ function is used to translate messages that change depending on the number of items, which is particularly useful for applications with multiple items.

Example 8: Using Message IDs

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def display_message():
    # Use message IDs for different contexts
    print(_('Welcome to the Your Application'))

    # Another context with a different translation
    print(_('Thank you for using our application.'))

display_message()

Explanation: - This example shows how to use message IDs to provide different translations for similar strings based on their context. This is useful for maintaining consistency in translations while providing additional variations.

Example 9: Using Message Contexts

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def display_message():
    # Use message contexts to provide context-specific translations
    print(_('The answer is 42.0'))  # Standard translation

    # Context-specific translation for numbers
    print(_('%d') % 42)  # Customized number format

display_message()

Explanation: - This example demonstrates how to use message contexts to provide context-specific translations. The _%(number)d syntax allows for customization of the way certain variables are displayed.

Example 10: Handling Plural Forms with Message IDs and Contexts

import gettext

# Set up the translation environment
path = '/path/to/your/locale/directory'
lang_code = 'en_US.UTF-8'

gettext.bindtextdomain('your_application', path)
gettext.textdomain('your_application')
_ = gettext.gettext

def count_items(items):
    # Use message IDs and contexts for plural forms
    plural_form_id = _('item_plural') if len(items) == 1 else _('items_plural')

    print(_('%d %s') % (len(items), plural_form_id))

count_items([1, 2, 3])

Explanation: - This example shows how to combine message IDs and contexts for handling plural forms. This is useful for applications where different messages are needed based on the number of items while maintaining consistency in their appearance.

Conclusion

The gettext module provides a flexible framework for internationalizing Python applications. By following these examples, you can effectively use this module to translate your application into various languages, improving its accessibility and user experience.

locale - Internationalization services.md

locale - Internationalization services

Below are comprehensive code examples for the locale module in Python, covering various functionalities related to internationalization. Each example is accompanied by comments explaining each step.

import locale
import datetime

# Set the default locale (system-dependent)
try:
    # Use the system's preferred locale settings
    locale.setlocale(locale.LC_ALL, '')
except locale.Error as e:
    print(f"Failed to set locale: {e}")

# Get information about available locales
available_locales = locale.locale_alias.keys()
print("Available locales:")
for code in available_locales:
    print(code)

# Set a specific locale (example: French)
try:
    # Setting the locale for LC_ALL, ensuring all categories are affected
    locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
    print(f"Locale set to: {locale.getlocale(locale.LC_ALL)}")
except locale.Error as e:
    print(f"Failed to set locale: {e}")

# Get the current locale settings
current_locale = locale.getlocale()
print("Current locale settings:")
print(f"Language: {current_locale[0]}, Encoding: {current_locale[1]}")

# Format a number using a specific locale
number = 123456.789
formatted_number = locale.currency(number)
print(f"Formatted currency: {formatted_number}")

# Format a string with localized date and time
now = datetime.datetime.now()
localized_date = now.strftime("%A, %B %d, %Y")
localized_time = now.strftime("%I:%M %p")
print(f"Localized Date: {localized_date}")
print(f"Localized Time: {localized_time}")

# Set the locale for LC_TIME to get localized date and time format
try:
    locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')
    localized_date = now.strftime("%A, %B %d, %Y")
    localized_time = now.strftime("%I:%M %p")
    print(f"Localized Date with LC_TIME: {localized_date}")
    print(f"Localized Time with LC_TIME: {localized_time}")
except locale.Error as e:
    print(f"Failed to set locale: {e}")

# Reset the locale settings to default
try:
    locale.setlocale(locale.LC_ALL, '')
    print(f"Locale reset to system default: {locale.getlocale(locale.LC_ALL)}")
except locale.Error as e:
    print(f"Failed to reset locale: {e}")

Explanation:

  1. Setting the Default Locale:
  2. The locale.setlocale(locale.LC_ALL, '') sets the locale according to the system's preferred settings. This is useful for applications that need to adapt to user preferences.

  3. Available Locales:

  4. locale.locale_alias.keys() returns a list of all available locales. This can be helpful for users or developers who need to understand what locales are supported on their system.

  5. Setting a Specific Locale:

  6. locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') sets the locale to French (France) using UTF-8 encoding. You can replace 'fr_FR.UTF-8' with any other locale identifier available on your system.

  7. Current Locale Settings:

  8. locale.getlocale() retrieves the current locale settings for all categories (LC_ALL, LC_CTYPE, LC_COLLATE, etc.).

  9. Formatting Numbers and Strings:

  10. locale.currency(number) formats a number as currency using the specified locale.
  11. strftime is used to format dates and times according to the locale's date and time formatting rules.

  12. Setting LC_TIME for Locale-Specific Date/Time Formatting:

  13. Changing the locale to LC_TIME ensures that date and time formats are displayed according to the chosen locale, which can be useful for applications that need specific date/time formats.

  14. Resetting Locale Settings:

  15. locale.setlocale(locale.LC_ALL, '') resets the locale settings back to their system default, ensuring that the application runs without any locale-specific configurations.

These examples cover a range of functionalities provided by the locale module, allowing for effective internationalization in Python applications.

Internet Data Handling

base64 - Base16, Base32, Base64, Base85 Data Encodings.md

base64 - Base16, Base32, Base64, Base85 Data Encodings

The base64 module in Python provides functions to encode and decode data using various encoding standards such as Base16, Base32, Base64, and Base85. Below are comprehensive examples of how to use these functionalities.

Base16 Encoding

Example 1: Encode a string to Base16

import base64

# Original string
data = "Hello, World!"

# Convert bytes to Base16 encoded bytes
base16_bytes = base64.b16encode(data.encode('utf-8'))

# Decode the Base16 bytes back to a string
base16_string = base16_bytes.decode('utf-8')

print(f"Base16 Encoded: {base16_string}")

Explanation: - We first encode the input string "Hello, World!" into bytes using UTF-8 encoding. - The base64.b16encode() function then encodes these bytes to Base16 format. - Finally, we decode the resulting Base16 bytes back into a string.

Base32 Encoding

Example 2: Encode a string to Base32

import base64

# Original string
data = "Hello, World!"

# Convert bytes to Base32 encoded bytes
base32_bytes = base64.b32encode(data.encode('utf-8'))

# Decode the Base32 bytes back to a string
base32_string = base32_bytes.decode('utf-8')

print(f"Base32 Encoded: {base32_string}")

Explanation: - Similar to Base16, we first encode the input string into bytes. - The base64.b32encode() function converts these bytes to Base32 format. - We then decode the resulting Base32 bytes back into a string.

Base64 Encoding

Example 3: Encode a string to Base64

import base64

# Original string
data = "Hello, World!"

# Convert bytes to Base64 encoded bytes
base64_bytes = base64.b64encode(data.encode('utf-8'))

# Decode the Base64 bytes back to a string
base64_string = base64_bytes.decode('utf-8')

print(f"Base64 Encoded: {base64_string}")

Explanation: - The base64.b64encode() function is used to encode the input string into Base64 format. - We then decode the resulting Base64 bytes back into a string.

Base85 Encoding

Example 4: Encode a string to Base85

import base64

# Original string
data = "Hello, World!"

# Convert bytes to Base85 encoded bytes
base85_bytes = base64.b85encode(data.encode('utf-8'))

# Decode the Base85 bytes back to a string
base85_string = base85_bytes.decode('utf-8')

print(f"Base85 Encoded: {base85_string}")

Explanation: - The base64.b85encode() function encodes the input string into Base85 format. - We then decode the resulting Base85 bytes back into a string.

Handling Large Data

For handling very large data, ensure that you use streaming or chunked encoding to avoid memory issues:

import base64

# Original string
data = "This is a very long string that we want to encode using Base64."

# Encode in chunks
encoded_chunks = []
chunk_size = 1024 * 8  # 8KB
for i in range(0, len(data), chunk_size):
    encoded_chunk = base64.b64encode(data[i:i+chunk_size].encode('utf-8'))
    encoded_chunks.append(encoded_chunk.decode('utf-8'))

# Join the chunks to form the complete Base64 string
encoded_string = ''.join(encoded_chunks)

print(f"Base64 Encoded: {encoded_string}")

Explanation: - In this example, we encode the data in chunks of 8KB. This approach is useful for large datasets that cannot fit into memory at once. - We concatenate the encoded chunks into a single string.

These examples demonstrate how to use the base64 module to encode strings and handle large amounts of data efficiently.

binascii - Convert between binary and ASCII.md

binascii - Convert between binary and ASCII

The binascii module in Python provides functions to convert between various binary formats, including hexadecimal, octal, and base64 encoding/decoding. Below are comprehensive code examples demonstrating each functionality of the binascii module.

Example 1: Hexadecimal Encoding

import binascii

def hex_encoding_example():
    """
    This example demonstrates how to convert a byte string to its hexadecimal representation.
    """
    # Define a sample binary data as bytes
    binary_data = b'Hello, World!'

    # Convert the binary data to hexadecimal format
    hex_representation = binascii.hexlify(binary_data)

    # Print the result
    print(f"Hexadecimal Representation: {hex_representation.decode('utf-8')}")

# Run the example function
hex_encoding_example()

Example 2: Hexadecimal Decoding

import binascii

def hex_decoding_example():
    """
    This example demonstrates how to convert a hexadecimal string back to its original byte data.
    """
    # Define a sample hexadecimal string
    hex_string = b'48656c6c6f2c20576f726c64'

    # Convert the hexadecimal string back to binary data
    binary_data = binascii.unhexlify(hex_string)

    # Print the result
    print(f"Original Binary Data: {binary_data.decode('utf-8')}")

# Run the example function
hex_decoding_example()

Example 3: Octal Encoding

import binascii

def octal_encoding_example():
    """
    This example demonstrates how to convert a byte string to its octal representation.
    Note: The output is in 'o' format which is not the standard octal, but rather an internal format used by Python.
    """
    # Define a sample binary data as bytes
    binary_data = b'Hello, World!'

    # Convert the binary data to octal format
    octal_representation = binascii.octlify(binary_data)

    # Print the result
    print(f"Octal Representation: {octal_representation.decode('utf-8')}")

# Run the example function
octal_encoding_example()

Example 4: Base64 Encoding

import binascii

def base64_encoding_example():
    """
    This example demonstrates how to convert a byte string to its Base64 representation.
    """
    # Define a sample binary data as bytes
    binary_data = b'Hello, World!'

    # Convert the binary data to Base64 format
    base64_representation = binascii.b64encode(binary_data)

    # Print the result
    print(f"Base64 Representation: {base64_representation.decode('utf-8')}")

# Run the example function
base64_encoding_example()

Example 5: Base64 Decoding

import binascii

def base64_decoding_example():
    """
    This example demonstrates how to convert a Base64 string back to its original byte data.
    """
    # Define a sample Base64 string
    base64_string = b'SGVsbG8sIFdvcmxkIQ=='

    # Convert the Base64 string back to binary data
    binary_data = binascii.b64decode(base64_string)

    # Print the result
    print(f"Original Binary Data: {binary_data.decode('utf-8')}")

# Run the example function
base64_decoding_example()

Example 6: Binary to String Conversion

import binascii

def binary_to_string_example():
    """
    This example demonstrates how to convert a byte string to its ASCII representation.
    """
    # Define a sample binary data as bytes
    binary_data = b'Hello, World!'

    # Convert the binary data to ASCII string
    ascii_representation = binary_data.decode('utf-8')

    # Print the result
    print(f"ASCII Representation: {ascii_representation}")

# Run the example function
binary_to_string_example()

Example 7: String to Binary Conversion

import binascii

def string_to_binary_example():
    """
    This example demonstrates how to convert an ASCII string back to its byte data.
    """
    # Define a sample ASCII string
    ascii_string = "Hello, World!"

    # Convert the ASCII string to binary data
    binary_data = ascii_string.encode('utf-8')

    # Print the result
    print(f"Binary Data: {binary_data}")

# Run the example function
string_to_binary_example()

Example 8: Hexadecimal to String Conversion

import binascii

def hex_to_string_example():
    """
    This example demonstrates how to convert a hexadecimal string back to its ASCII representation.
    """
    # Define a sample hexadecimal string
    hex_string = "48656c6c6f2c20576f726c64"

    # Convert the hexadecimal string to binary data
    binary_data = binascii.unhexlify(hex_string)

    # Convert the binary data back to ASCII string
    ascii_representation = binary_data.decode('utf-8')

    # Print the result
    print(f"ASCII Representation: {ascii_representation}")

# Run the example function
hex_to_string_example()

Example 9: String to Hexadecimal Conversion

import binascii

def string_to_hex_example():
    """
    This example demonstrates how to convert an ASCII string to its hexadecimal representation.
    """
    # Define a sample ASCII string
    ascii_string = "Hello, World!"

    # Convert the ASCII string to binary data
    binary_data = ascii_string.encode('utf-8')

    # Convert the binary data to hexadecimal format
    hex_representation = binascii.hexlify(binary_data)

    # Print the result
    print(f"Hexadecimal Representation: {hex_representation.decode('utf-8')}")

# Run the example function
string_to_hex_example()

Example 10: Base64 to String Conversion

import binascii

def base64_to_string_example():
    """
    This example demonstrates how to convert a Base64 string back to its ASCII representation.
    """
    # Define a sample Base64 string
    base64_string = "SGVsbG8sIFdvcmxkIQ=="

    # Convert the Base64 string to binary data
    binary_data = binascii.b64decode(base64_string)

    # Convert the binary data back to ASCII string
    ascii_representation = binary_data.decode('utf-8')

    # Print the result
    print(f"ASCII Representation: {ascii_representation}")

# Run the example function
base64_to_string_example()

Example 11: String to Base64 Conversion

import binascii

def string_to_base64_example():
    """
    This example demonstrates how to convert an ASCII string to its Base64 representation.
    """
    # Define a sample ASCII string
    ascii_string = "Hello, World!"

    # Convert the ASCII string to binary data
    binary_data = ascii_string.encode('utf-8')

    # Convert the binary data to Base64 format
    base64_representation = binascii.b64encode(binary_data)

    # Print the result
    print(f"Base64 Representation: {base64_representation.decode('utf-8')}")

# Run the example function
string_to_base64_example()

Additional Examples

  1. Escape Sequences to Binary Conversion: ```python import binascii

def escape_sequences_to_binary(): """ This example demonstrates how to convert escape sequences in a string back to binary data. """ # Define a sample string with escape sequences escape_string = "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64"

   # Convert the escape string to binary data
   binary_data = binascii.unhexlify(escape_string)

   # Print the result
   print(f"Binary Data: {binary_data.decode('utf-8')}")

# Run the example function escape_sequences_to_binary() ```

  1. Binary to Escape Sequences Conversion: ```python import binascii

def binary_to_escape_sequences(): """ This example demonstrates how to convert binary data to its escape sequence representation. """ # Define a sample byte string binary_data = b'Hello, World!'

   # Convert the binary data to hexadecimal format and then to escape sequences
   hex_representation = binascii.hexlify(binary_data)
   escape_sequences = "\\x" + "\\x".join(hex_representation.decode('utf-8'))

   # Print the result
   print(f"Escape Sequences: {escape_sequences}")

# Run the example function binary_to_escape_sequences() ```

These examples cover a wide range of functionalities provided by the binascii module, from basic conversions to more complex operations involving escape sequences. Each example is self-contained and demonstrates a specific use case for converting between different data formats using Python's binascii library.

email - An email and MIME handling package.md

email - An email and MIME handling package

The email module in Python provides a comprehensive set of tools for parsing, creating, modifying, and sending email messages. Below are several examples that demonstrate how to use this module for different tasks.

Example 1: Creating an Email Message

from email.message import EmailMessage

# Create a new email message object
msg = EmailMessage()

# Set the sender and recipient
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'

# Set the subject of the email
msg['Subject'] = 'Hello, World!'

# Add the body of the email as a plain text
msg.set_content('This is a simple test email message.')

# Optionally, add HTML content to the email
html_message = '''
<html>
<head></head>
<body>
<p>This is a <strong>test</strong> email message with HTML content.</p>
</body>
</html>
'''
msg.add_alternative(html_message, subtype='html')

# Print the full email message for debugging purposes
print(msg)

# Save the email to a file
with open('email.txt', 'w') as f:
    f.write(msg.as_string())

Example 2: Parsing an Email Message

from email.message import EmailMessage

# Read the email from a file or any other source
with open('email.txt', 'r') as f:
    raw_email = f.read()

# Create an EmailMessage object from the raw email data
msg = EmailMessage.from_string(raw_email)

# Access header information
print(f'From: {msg["From"]}')
print(f'To: {msg["To"]}')
print(f'Subject: {msg["Subject"]}')

# Check if there is any plain text content
if msg.is_multipart() and 'plain' in msg['Content-Type']:
    for part in msg.walk():
        if part.get_content_type() == 'text/plain':
            print(part.get_payload(decode=True).decode('utf-8'))

# Check if there is any HTML content
elif 'html' in msg['Content-Type']:
    for part in msg.walk():
        if part.get_content_type() == 'text/html':
            print(part.get_payload(decode=True).decode('utf-8'))

Example 3: Sending an Email using SMTP

import smtplib
from email.message import EmailMessage

# Define the email message object
msg = EmailMessage()
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'
msg['Subject'] = 'Hello, World!'

# Set the body of the email as a plain text
msg.set_content('This is a test email sent using SMTP.')

# Connect to an SMTP server and send the email
with smtplib.SMTP('smtp.example.com', 587) as server:
    server.starttls()
    server.login('sender@example.com', 'password')
    server.send_message(msg)

Example 4: Attaching Files to Email

import smtplib
from email.message import EmailMessage
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# Define the email message object
msg = EmailMessage()
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'
msg['Subject'] = 'Hello, World!'

# Set the body of the email as a plain text
msg.set_content('This is a test email with an attachment.')

# Create a multipart message to hold both the text and attachments
multipart_msg = MIMEMultipart()
multipart_msg.attach(msg)

# Attach a file
filename = 'file_to_attach.txt'
attachment = open(filename, "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f"attachment; filename= {filename}")

multipart_msg.attach(part)

# Connect to an SMTP server and send the email
with smtplib.SMTP('smtp.example.com', 587) as server:
    server.starttls()
    server.login('sender@example.com', 'password')
    text = multipart_msg.as_string()
    server.sendmail('sender@example.com', 'receiver@example.com', text)

Example 5: Handling Email Attachments

from email.message import EmailMessage
import os

# Define the email message object
msg = EmailMessage()
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'
msg['Subject'] = 'Hello, World!'

# Set the body of the email as a plain text
msg.set_content('This is a test email with an attachment.')

# Define a directory containing files to attach
directory = 'files_to_attach'
attachments = [os.path.join(directory, f) for f in os.listdir(directory)]

for filename in attachments:
    # Create a MIMEBase object for each file
    part = MIMEBase('application', 'octet-stream')
    part.set_payload((open(filename, "rb")).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', f"attachment; filename= {filename}")

    # Attach the MIMEBase object to the email message
    msg.attach(part)

# Connect to an SMTP server and send the email
with smtplib.SMTP('smtp.example.com', 587) as server:
    server.starttls()
    server.login('sender@example.com', 'password')
    text = msg.as_string()
    server.sendmail('sender@example.com', 'receiver@example.com', text)

Example 6: Filtering Emails from a Mailbox

import imaplib
from email.parser import BytesParser

# Connect to an IMAP server
imap = imaplib.IMAP4_SSL('imap.example.com')
imap.login('username', 'password')

# Select the mailbox you want to search in (e.g., INBOX)
imap.select('INBOX')

# Search for emails with a specific keyword in the subject line
search_result, data = imap.search(None, '(SUBJECT "Hello")')
email_ids = data[0].split()

for email_id in email_ids:
    # Fetch the raw email content
    _, msg_bytes = imap.fetch(email_id, "(RFC822)")
    msg_str = msg_bytes[0][1]

    # Parse the raw email into an EmailMessage object
    msg = BytesParser().parsemsg(msg_str)

    # Process the message (e.g., print the subject)
    print(f'Subject: {msg["Subject"]}')

# Close and logout from the IMAP server
imap.close()
imap.logout()

Example 7: Handling Email Addresses

from email.utils import parseaddr, formataddr

# Define a list of email addresses
email_list = [
    ('Alice', 'alice@example.com'),
    ('Bob', 'bob@example.org')
]

# Print each email address in the list
for name, email in email_list:
    # Parse the name and email into a tuple
    parsed_addr = parseaddr(f"{name} <{email}>")

    # Format the name and email back into a string
    formatted_email = formataddr(parsed_addr)

    print(formatted_email)

# Validate an email address
email_to_validate = 'invalid-email'
if parseaddr(email_to_validate):
    print(f"'{email_to_validate}' is a valid email address.")
else:
    print(f"'{email_to_validate}' is not a valid email address.")

These examples cover various aspects of handling emails using the email module, including creating, parsing, sending, attaching files, filtering emails from a mailbox, and manipulating email addresses. Each example is designed to be clear and self-contained, with comments explaining each step for better understanding.

json - JSON encoder and decoder.md

json - JSON encoder and decoder

Below are comprehensive code examples for various functionalities of the json module in Python, along with detailed comments explaining each step.

# Importing the json module
import json

# Example 1: Encoding a simple dictionary to JSON
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

# Using json.dumps() to convert the dictionary to a JSON string
json_data = json.dumps(data)
print("Encoded JSON:", json_data)

# Example 2: Encoding a Python object (list) to JSON
data_list = ["apple", "banana", "cherry"]
json_list = json.dumps(data_list)
print("Encoded list as JSON:", json_list)

# Example 3: Decoding a JSON string back to a dictionary
json_encoded_string = '{"name": "John", "age": 30, "city": "New York"}'
decoded_data = json.loads(json_encoded_string)
print("Decoded data from JSON:", decoded_data)

# Example 4: Encoding with specific indentation for readability
data_with_indentation = {
    "address": {
        "street": "123 Main St",
        "city": "Anytown"
    }
}
json_with_indent = json.dumps(data_with_indentation, indent=4)
print("Encoded data with indentation:", json_with_indent)

# Example 5: Encoding to a file
with open('data.json', 'w') as file:
    json.dump(data, file, indent=4)
print("Data written to data.json")

# Example 6: Decoding from a file
with open('data.json', 'r') as file:
    decoded_data_from_file = json.load(file)
print("Decoded data from data.json:", decoded_data_from_file)

# Example 7: Handling JSON with special characters (ensure correct encoding)
special_characters_data = {"name": "John Doe", "address": "123 Main St, New York, USA"}
json_special_chars = json.dumps(special_characters_data)
print("Encoded data with special characters:", json_special_chars)

# Example 8: Encoding to a file in binary mode
with open('binary_data.json', 'wb') as file:
    file.write(json.dumps(data).encode('utf-8'))
print("Binary data written to binary_data.json")

# Example 9: Decoding from a file in binary mode
with open('binary_data.json', 'rb') as file:
    decoded_binary_data = json.loads(file.read().decode('utf-8'))
print("Decoded binary data:", decoded_binary_data)

# Example 10: Handling errors during encoding or decoding
try:
    # Attempt to encode a non-serializable object
    json.dumps([{"name": "John", "age": 30}, None, {"nested": [1, 2, 3]}])
except TypeError as e:
    print("Error:", e)

# Example 11: Encoding with custom serialization (if needed)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def person_to_dict(person):
    return {"name": person.name, "age": person.age}

person = Person("Jane", 25)
json_person = json.dumps(person, default=person_to_dict)
print("Encoded custom object:", json_person)

# Example 12: Handling errors during encoding with custom serialization
class InvalidPerson:
    def __init__(self, name):
        self.name = name

try:
    # Attempt to encode an invalid custom object
    json.dumps([{"name": "John", "age": 30}, InvalidPerson("Jane")])
except TypeError as e:
    print("Error:", e)

Explanation:

  1. Encoding and Decoding:
  2. json.dumps() converts a Python dictionary or list to a JSON string.
  3. json.loads() parses a JSON string back into a Python object (dictionary, list).

  4. Indentation for Readability:

  5. The indent parameter in json.dumps() can be used to format the output with indentation for better readability.

  6. Encoding to and Decoding from Files:

  7. Use open() to write to or read from files.
  8. json.dump() writes a Python object to a file.
  9. json.load() reads a JSON formatted file and converts it back into a Python object.

  10. Special Characters and Encoding:

  11. Ensure that special characters are properly encoded by using the correct encoding when writing to or reading from files.

  12. Binary Mode:

  13. Use binary mode ('wb' for writing and 'rb' for reading) when dealing with binary data.

  14. Error Handling:

  15. Catch TypeError exceptions when attempting to encode non-serializable objects.
  16. Implement custom serialization functions to handle complex objects or types that are not natively serializable by Python's default JSON encoder.

  17. Custom Serialization:

  18. Define a function to convert custom objects into a format that can be serialized by the json module.

These examples cover various aspects of the json module, providing a comprehensive guide for using it in different scenarios.

mailbox - Manipulate mailboxes in various formats.md

mailbox - Manipulate mailboxes in various formats

The mailbox module in Python provides a consistent interface to access mailboxes in several popular formats, including mbox, Maildir, IMAP4, and POP3. Below are comprehensive examples demonstrating how to use this module for different operations.

Example 1: Reading an mbox mailbox

import mailbox

# Open an existing mbox mailbox
with mailbox.mbox('path/to/your/mailbox') as m:
    # Iterate over all messages in the mailbox
    for msg in m:
        # Print the message ID and sender
        print(f"Message ID: {msg['Message-ID']}, From: {msg['From']}")

# Example output:
# Message ID: <uuid@domain.com>, From: user@example.com

Example 2: Writing to an mbox mailbox

import mailbox

# Create a new empty mbox file for writing
with mailbox.mbox('path/to/new_mailbox') as m:
    # Create a new email message
    msg = mailbox.Message()
    msg['From'] = 'sender@example.com'
    msg['To'] = 'recipient@example.com'
    msg['Subject'] = 'Test Message'
    msg.set_payload("This is the body of the test message.")

    # Add the message to the mailbox
    m.add(msg)

# Example output: The message will be added to the mbox file.

Example 3: Reading from a Maildir mailbox

import mailbox

# Open an existing Maildir mailbox
with mailbox.Maildir('path/to/your/maildir') as m:
    # Iterate over all messages in the mailbox
    for msg in m:
        # Print the message ID and subject
        print(f"Message ID: {msg['Message-ID']}, Subject: {msg['Subject']}")

# Example output:
# Message ID: <uuid@domain.com>, Subject: Test Email

Example 4: Writing to a Maildir mailbox

import mailbox

# Create a new empty Maildir directory for writing
with mailbox.Maildir('path/to/new_maildir') as m:
    # Create a new email message
    msg = mailbox.Message()
    msg['From'] = 'sender@example.com'
    msg['To'] = 'recipient@example.com'
    msg['Subject'] = 'Test Message'
    msg.set_payload("This is the body of the test message.")

    # Add the message to the Maildir mailbox
    m.add(msg)

# Example output: The message will be added to a new directory within the Maildir.

Example 5: Reading from an IMAP4 mailbox

import mailbox

# Connect to an IMAP4 server and login
imap = mailbox.IMAP4_SSL('imap.example.com', 993)
imap.login('username@example.com', 'password')

# Select a mailbox (e.g., INBOX)
imap.select("INBOX")

# Search for all messages
status, data = imap.search(None, "ALL")
for num in data[0].split():
    # Fetch the email message by number
    status, msg_data = imap.fetch(num, "(RFC822)")
    msg = mailbox.Message(msg_data[1][1])

    # Print the sender and subject of the message
    print(f"Sender: {msg['From']}, Subject: {msg['Subject']}")

# Example output: The sender and subject of each email will be printed.

Example 6: Writing to an IMAP4 mailbox

import mailbox

# Connect to an IMAP4 server and login
imap = mailbox.IMAP4_SSL('imap.example.com', 993)
imap.login('username@example.com', 'password')

# Select a mailbox (e.g., INBOX)
imap.select("INBOX")

# Create a new email message
msg = mailbox.Message()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = 'Test Message'
msg.set_payload("This is the body of the test message.")

# Append the message to the IMAP4 mailbox
imap.append("INBOX", msg.as_bytes())

# Example output: The message will be appended to the specified mailbox.

Example 7: Reading from a POP3 mailbox

import mailbox

# Connect to a POP3 server and login
pop = mailbox.POP3('pop.example.com', 110)
pop.user('username@example.com')
pop.pass_('password')

# Retrieve all messages
num_messages = pop.stat()[0]
for i in range(num_messages):
    # Retrieve the message by index
    msg = mailbox.Message(pop.retr(i + 1)[1])

    # Print the sender and subject of the message
    print(f"Sender: {msg['From']}, Subject: {msg['Subject']}")

# Example output: The sender and subject of each email will be printed.

Example 8: Writing to a POP3 mailbox

import mailbox

# Connect to a POP3 server and login
pop = mailbox.POP3('pop.example.com', 110)
pop.user('username@example.com')
pop.pass_('password')

# Create a new email message
msg = mailbox.Message()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = 'Test Message'
msg.set_payload("This is the body of the test message.")

# Append the message to the POP3 mailbox
pop.append("INBOX", msg.as_bytes())

# Example output: The message will be appended to the specified mailbox.

Explanation

These examples demonstrate how to use the mailbox module to interact with different types of mailboxes in various formats. Each example includes comments that explain key operations and outputs for clarity.

mimetypes - Map filenames to MIME types.md

mimetypes - Map filenames to MIME types

Here is a comprehensive set of code examples for using the mimetypes module in Python, including comments that explain each step:

import mimetypes

# Function to guess the MIME type of a file based on its extension
def get_mime_type(file_path):
    """
    Given a file path, this function uses the mimetypes module to guess the MIME type.

    Parameters:
    - file_path (str): The path to the file whose MIME type is to be guessed.

    Returns:
    - str: The MIME type of the file, or 'application/octet-stream' if it cannot be determined.
    """
    # Guess the MIME type based on the file extension
    mime_type, _ = mimetypes.guess_type(file_path)

    return mime_type

# Example usage of get_mime_type function
if __name__ == "__main__":
    file_path = 'example.txt'
    mime_type = get_mime_type(file_path)
    print(f"The MIME type of {file_path} is: {mime_type}")

# Function to register a new MIME type and its corresponding extension(s)
def register_new_mimetype(mime_type, extensions):
    """
    Registers a new MIME type with the mimetypes module. This allows customizing how the
    mimetypes module handles files with specific extensions.

    Parameters:
    - mime_type (str): The MIME type to be registered.
    - extensions (list of str): A list of file extensions associated with this MIME type.
    """
    # Register the new MIME type and its extensions
    mimetypes.add_type(mime_type, *extensions)

# Example usage of register_new_mimetype function
if __name__ == "__main__":
    new_mime_type = 'application/custom'
    new_extensions = ['custom', '.cst']
    register_new_mimetype(new_mime_type, new_extensions)
    print(f"New MIME type '{new_mime_type}' registered for extensions: {new_extensions}")

# Function to display all known MIME types and their associated file extensions
def list_mime_types():
    """
    Lists all MIME types registered in the mimetypes module along with their associated file extensions.
    """
    # Retrieve a dictionary of all MIME types and their file extensions
    mime_map = mimetypes.types_map

    # Print each MIME type and its extensions
    for mime_type, extensions in mime_map.items():
        print(f"{mime_type}: {extensions}")

# Example usage of list_mime_types function
if __name__ == "__main__":
    list_mime_types()

Explanation:

  1. get_mime_type(file_path): This function uses mimetypes.guess_type() to determine the MIME type of a file based on its extension. It returns the MIME type or 'application/octet-stream' if the type cannot be determined.

  2. register_new_mimetype(mime_type, extensions): This function allows you to register a new MIME type and associate it with specific file extensions. It uses mimetypes.add_type() to add the mapping.

  3. list_mime_types(): This function retrieves all registered MIME types and their associated file extensions from mimetypes.types_map and prints them out.

These examples demonstrate how to use the mimetypes module for basic tasks such as guessing MIME types, registering new MIME types, and listing all known MIME types. The code is designed to be clear and reusable, making it suitable for inclusion in documentation or as a standalone script.

quopri - Encode and decode MIME quoted-printable data.md

quopri - Encode and decode MIME quoted-printable data

The quopri module in Python is used to encode and decode MIME quoted-printable (QP) encoded strings, which are often used in email headers. Below are comprehensive examples demonstrating how to use this module for encoding and decoding QP data.

Encoding QP Data

QP encoding converts binary data into a printable format that can be safely transmitted over ASCII-based media like email headers. Here's an example of how to encode binary data using the quopri module:

import quopri

def encode_qp_string(input_data):
    # Convert the input data to bytes if it isn't already
    if not isinstance(input_data, bytes):
        input_data = input_data.encode('utf-8')

    # Encode the binary data using QP encoding
    encoded_data = quopri.encodestring(input_data)

    return encoded_data.decode()

# Example usage
if __name__ == "__main__":
    original_message = "Hello, world! This is a test message with special characters like รฑ and โ‚ฌ."
    encoded_message = encode_qp_string(original_message)
    print("Original Message:", original_message)
    print("Encoded QP Message:", encoded_message)

Decoding QP Data

Decoding QP encoded strings back to their original binary form can be done using the quopri module. Here's an example of how to decode a QP encoded string:

import quopri

def decode_qp_string(encoded_data):
    # Decode the QP encoded data back to bytes
    decoded_bytes = quopri.decodestring(encoded_data)

    # Convert the bytes back to a string if needed
    decoded_text = decoded_bytes.decode('utf-8')

    return decoded_text

# Example usage
if __name__ == "__main__":
    encoded_message = "Hello, world! This is a test message with special characters like =C3=BA and =E2=82=A2."
    original_message = decode_qp_string(encoded_message)
    print("Encoded QP Message:", encoded_message)
    print("Decoded Original Message:", original_message)

Key Points

  1. Encoding: The quopri.encodestring() function takes binary data as input and returns a QP encoded string.

  2. Decoding: The quopri.decodestring() function takes a QP encoded string and returns the original bytes.

  3. Character Encoding: Both encoding and decoding assume that the input data is in UTF-8, which is common for text strings. You can specify different encodings if needed by passing them as arguments to the encode() and decode() methods.

  4. Example Strings: The example strings used are designed to demonstrate special characters (รฑ and โ‚ฌ) that might be encoded in QP format.

These examples provide a basic understanding of how to use the quopri module for encoding and decoding MIME quoted-printable data.

Internet Protocols and Support

ftplib - FTP protocol client.md

ftplib - FTP protocol client

The ftplib module provides a way to interact with an FTP (File Transfer Protocol) server using Python. Below are comprehensive examples demonstrating various functionalities of this module, including connecting to an FTP server, uploading and downloading files, changing directories, handling basic commands, and closing the connection.

Example 1: Connecting to an FTP Server

import ftplib

# Connect to the FTP server with default port (21)
ftp = ftplib.FTP('ftp.example.com')

# Login using username and password
ftp.login(user='your_username', passwd='your_password')

# Print welcome message from the server
print(ftp.getwelcome())

# Close the connection
ftp.quit()

Example 2: Uploading a File

import ftplib

def upload_file():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Specify the local file path to be uploaded
        local_file_path = 'path/to/local/file.txt'

        # Define the remote filename on the server where the file will be stored
        remote_filename = 'remote/file.txt'

        # Open the local file in binary mode and upload it to the server
        with open(local_file_path, 'rb') as file:
            ftp.storbinary(f'STOR {remote_filename}', file)

        print(f'File {local_file_path} uploaded successfully as {remote_filename}')

    except ftplib.error_perm as e:
        print(f'Upload failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to upload a file
upload_file()

Example 3: Downloading a File

import ftplib

def download_file():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Specify the remote file path on the server to be downloaded
        remote_file_path = 'remote/file.txt'

        # Define the local filename where the file will be saved locally
        local_file_path = 'path/to/local/file_downloaded.txt'

        # Open a binary file in write mode and download the file from the server
        with open(local_file_path, 'wb') as file:
            ftp.retrbinary(f'RETR {remote_file_path}', file.write)

        print(f'File {remote_file_path} downloaded successfully as {local_file_path}')

    except ftplib.error_perm as e:
        print(f'Download failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to download a file
download_file()

Example 4: Changing Directory

import ftplib

def change_directory():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Change to a specific directory on the server
        remote_directory = '/path/to/remote/directory'
        ftp.cwd(remote_directory)

        print(f'Changed to {remote_directory}')

    except ftplib.error_perm as e:
        print(f'Directory change failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to change directory
change_directory()

Example 5: Listing Files in a Directory

import ftplib

def list_files():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Change to a specific directory on the server
        remote_directory = '/path/to/remote/directory'
        ftp.cwd(remote_directory)

        # List files in the current directory
        files_list = ftp.nlst()

        print(f'Files in {remote_directory}:')
        for file in files_list:
            print(file)

    except ftplib.error_perm as e:
        print(f'Directory listing failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to list files
list_files()

Example 6: Handling FTP Errors

import ftplib

def handle_ftp_errors():
    try:
        # Connect to the FTP server with default port (21)
        ftp = ftplib.FTP('ftp.example.com')

        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Specify a non-existent file path for testing error handling
        remote_file_path = 'non_existent/file.txt'

        # Attempt to retrieve the file, which should fail
        ftp.retrbinary(f'RETR {remote_file_path}', lambda data: None)

    except ftplib.error_perm as e:
        print(f'Error retrieving file: {e}')

    finally:
        # Close the connection
        if 'ftp' in locals():
            ftp.quit()

# Call the function to handle FTP errors
handle_ftp_errors()

Example 7: Storing Large Files

To upload large files efficiently, consider using a context manager to handle file operations:

import ftplib
import os

def store_large_file(local_file_path, remote_filename):
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Open the local file in binary mode
        with open(local_file_path, 'rb') as file:
            # Use STORbinary to upload the file in chunks
            ftp.storbinary(f'STOR {remote_filename}', file)

        print(f'Large file {local_file_path} uploaded successfully as {remote_filename}')

    except ftplib.error_perm as e:
        print(f'Large file upload failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to store a large file
store_large_file('path/to/large/file.txt', 'large_file_downloaded.txt')

Example 8: Renaming or Moving Files

import ftplib

def rename_or_move_files():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Define old and new file paths on the server
        remote_old_file_path = 'remote/oldfile.txt'
        remote_new_file_path = 'remote/newfile.txt'

        # Rename or move the file
        ftp.rename(remote_old_file_path, remote_new_file_path)

        print(f'File {remote_old_file_path} renamed/moved to {remote_new_file_path}')

    except ftplib.error_perm as e:
        print(f'Rename/move failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to rename or move files
rename_or_move_files()

Example 9: Deleting Files

import ftplib

def delete_file():
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Define the remote file path on the server to be deleted
        remote_file_path = 'remote/file.txt'

        # Delete the file from the server
        ftp.delete(remote_file_path)

        print(f'File {remote_file_path} deleted successfully')

    except ftplib.error_perm as e:
        print(f'Delete failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to delete a file
delete_file()

Example 10: Changing Permissions

FTP servers typically do not support changing permissions directly through ftplib. However, you can simulate this by deleting and then uploading a new file with desired permissions.

import ftplib
import os

def change_permissions(local_file_path, remote_filename):
    # Connect to the FTP server with default port (21)
    ftp = ftplib.FTP('ftp.example.com')

    try:
        # Login using username and password
        ftp.login(user='your_username', passwd='your_password')

        # Define old and new file paths on the server
        remote_old_file_path = 'remote/oldfile.txt'
        remote_new_file_path = 'remote/newfile.txt'

        # Delete the old file to simulate permission change
        try:
            ftp.delete(remote_old_file_path)
        except ftplib.error_perm as e:
            print(f'Delete failed: {e}')

        # Upload a new file with desired permissions
        with open(local_file_path, 'rb') as file:
            ftp.storbinary(f'STOR {remote_new_file_path}', file)

        print(f'File {local_file_path} uploaded successfully as {remote_new_file_path}')

    except ftplib.error_perm as e:
        print(f'Upload failed: {e}')

    finally:
        # Close the connection
        ftp.quit()

# Call the function to change permissions
change_permissions('path/to/file.txt', 'file_with_desired_permissions.txt')

These examples cover a range of operations and error handling for FTP using Python's ftplib module. Adjust the paths and file names as necessary for your specific use case.

http - HTTP modules.md

http - HTTP modules

The http module is part of the Python Standard Library and provides a simple interface to make HTTP requests. Below are comprehensive code examples for various functionalities within the http module, along with explanations for each example.

1. Using the requests library

If you want to use more advanced features like handling cookies, sessions, or custom headers, consider using the requests library. Here's a basic example:

# Importing the requests library
import requests

# Making a GET request to a URL
response = requests.get('https://api.example.com/data')

# Checking if the request was successful
if response.status_code == 200:
    # Printing the content of the response
    print(response.text)
else:
    print(f"Failed to retrieve data. Status code: {response.status_code}")

# Making a POST request with custom headers and parameters
headers = {'User-Agent': 'MyApp/1.0'}
data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post('https://api.example.com/submit', headers=headers, data=data)

if response.status_code == 200:
    # Printing the content of the response
    print(response.text)
else:
    print(f"Failed to submit data. Status code: {response.status_code}")

2. Making GET Requests

import http.client

# Creating a connection to an HTTP server
conn = http.client.HTTPConnection('www.example.com')

# Sending a GET request with parameters
params = urllib.parse.urlencode({'param1': 'value1', 'param2': 'value2'})
conn.request("GET", "/path?%s" % params)

# Reading the response from the server
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()

# Closing the connection
conn.close()

# Printing the content of the response
print(data.decode('utf-8'))

3. Making POST Requests

import http.client

# Creating a connection to an HTTP server
conn = http.client.HTTPConnection('www.example.com')

# Sending a POST request with headers and data
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = urllib.parse.urlencode({'key1': 'value1', 'key2': 'value2'})
conn.request("POST", "/path", body=data, headers=headers)

# Reading the response from the server
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()

# Closing the connection
conn.close()

# Printing the content of the response
print(data.decode('utf-8'))

4. Handling Cookies

import http.client

# Creating a connection to an HTTP server
conn = http.client.HTTPConnection('www.example.com')

# Sending a GET request with cookies
cookies = urllib.parse.urlencode({'cookie1': 'value1', 'cookie2': 'value2'})
headers = {'Cookie': cookies}
conn.request("GET", "/path", headers=headers)

# Reading the response from the server
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()

# Closing the connection
conn.close()

# Printing the content of the response
print(data.decode('utf-8'))

5. Handling Redirects

import http.client

# Creating a connection to an HTTP server with follow redirects enabled
conn = http.client.HTTPConnection('www.example.com')

# Sending a GET request with follow_redirects set to True
headers = {'User-Agent': 'MyApp/1.0'}
conn.request("GET", "/path?redirect=1", headers=headers)

# Reading the response from the server
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()

# Closing the connection
conn.close()

# Printing the content of the response
print(data.decode('utf-8'))

6. Handling HTTP Exceptions

import http.client

try:
    # Creating a connection to an HTTP server
    conn = http.client.HTTPConnection('www.example.com')

    # Sending a GET request with parameters
    params = urllib.parse.urlencode({'param1': 'value1', 'param2': 'value2'})
    conn.request("GET", "/path?%s" % params)

    # Reading the response from the server
    response = conn.getresponse()
    print(response.status, response.reason)
    data = response.read()

    # Closing the connection
    conn.close()

    # Printing the content of the response
    print(data.decode('utf-8'))

except http.client.HTTPException as e:
    print(f"An error occurred: {e}")

7. Making Requests with Timeout

import http.client

try:
    # Creating a connection to an HTTP server with timeout set to 5 seconds
    conn = http.client.HTTPConnection('www.example.com')

    # Sending a GET request with parameters and timeout
    params = urllib.parse.urlencode({'param1': 'value1', 'param2': 'value2'})
    conn.request("GET", "/path?%s" % params, timeout=5)

    # Reading the response from the server
    response = conn.getresponse()
    print(response.status, response.reason)
    data = response.read()

    # Closing the connection
    conn.close()

    # Printing the content of the response
    print(data.decode('utf-8'))

except http.client.HTTPException as e:
    print(f"An error occurred: {e}")

except TimeoutError:
    print("The request timed out.")

These examples demonstrate different aspects of making HTTP requests using Python's http module. Each example includes comments to explain the purpose and functionality of each part of the code.

http.client - HTTP protocol client.md

http.client - HTTP protocol client

The http.client module is part of the Python standard library and provides a simple HTTP/1.1 client interface for making requests to web servers. Below are comprehensive examples for various functionalities provided by this module:

1. Basic GET Request

import http.client

# Create an HTTP connection to a server
conn = http.client.HTTPConnection("example.com")

# Make a GET request
conn.request("GET", "/")
response = conn.getresponse()

# Read the response from the server
data = response.read()
print(data.decode('utf-8'))

# Close the connection
conn.close()

2. Handling Headers and Query Parameters

import http.client
from urllib.parse import urlencode

# Create an HTTP connection to a server
conn = http.client.HTTPConnection("example.com")

# Define query parameters
params = {"key": "value", "page": 1}

# Encode the parameters into a URL string
query_string = urlencode(params)

# Make a GET request with query parameters
url = "/search?" + query_string
conn.request("GET", url)
response = conn.getresponse()

# Read and decode the response
data = response.read()
print(data.decode('utf-8'))

# Close the connection
conn.close()

3. POST Request with Form Data

import http.client
from urllib.parse import urlencode

# Create an HTTP connection to a server
conn = http.client.HTTPConnection("example.com")

# Define form data
form_data = {"username": "user", "password": "pass"}

# Encode the form data into a URL-encoded string
data = urlencode(form_data)

# Make a POST request with form data
url = "/login"
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
}
conn.request("POST", url, headers=headers, body=data)
response = conn.getresponse()

# Read and decode the response
data = response.read()
print(data.decode('utf-8'))

# Close the connection
conn.close()

4. Using HTTP/1.1 Connection Pooling

import http.client
from urllib.parse import urlencode
import socket

# Create an HTTP connection pool manager
pool_manager = http.client.HTTPConnectionPool(maxsize=5)

# Define query parameters
params = {"key": "value", "page": 1}

# Encode the parameters into a URL string
query_string = urlencode(params)

# Make a GET request with query parameters using the connection pool
url = "/search?" + query_string

with pool_manager.connection() as conn:
    conn.request("GET", url)
    response = conn.getresponse()

# Read and decode the response
data = response.read()
print(data.decode('utf-8'))

5. Handling Redirects

import http.client

# Create an HTTP connection to a server
conn = http.client.HTTPConnection("example.com")

# Make a GET request that may result in a redirect
url = "/redirect"
conn.request("GET", url)
response = conn.getresponse()

# Read and decode the response
data = response.read()
print(data.decode('utf-8'))

# Get the location header to follow the redirect
location = response.getheader('Location')
if location:
    print(f"Redirecting to: {location}")
else:
    print("No redirect found.")

# Close the connection
conn.close()

6. Handling Exceptions

import http.client

try:
    # Create an HTTP connection to a server that may not be reachable
    conn = http.client.HTTPConnection("nonexistent-domain.com")

    # Make a GET request
    conn.request("GET", "/")
    response = conn.getresponse()

    # Read and decode the response
    data = response.read()
    print(data.decode('utf-8'))
except http.client.HTTPException as e:
    print(f"HTTP error occurred: {e}")
finally:
    # Close the connection
    conn.close()

7. Using SSL/TLS

import http.client

# Create an HTTPS connection to a server with SSL/TLS enabled
conn = http.client.HTTPSConnection("example.com")

# Make a GET request over HTTPS
conn.request("GET", "/")
response = conn.getresponse()

# Read and decode the response
data = response.read()
print(data.decode('utf-8'))

# Close the connection
conn.close()

8. Handling Large Responses

import http.client

# Create an HTTP connection to a server that may have large responses
conn = http.client.HTTPConnection("example.com")

# Make a GET request for a large file
url = "/large-file"
conn.request("GET", url)
response = conn.getresponse()

# Read the response in chunks to handle large files
chunk_size = 1024
while True:
    chunk = response.read(chunk_size)
    if not chunk:
        break
    print(chunk.decode('utf-8'), end='')

# Close the connection
conn.close()

9. Handling Keep-Alive Connections

import http.client

# Create an HTTP connection with keep-alive enabled
conn = http.client.HTTPConnection("example.com")

# Make multiple requests using the same connection
url1 = "/resource1"
conn.request("GET", url1)
response1 = conn.getresponse()
print(response1.status, response1.reason)

url2 = "/resource2"
conn.request("GET", url2)
response2 = conn.getresponse()
print(response2.status, response2.reason)

# Close the connection
conn.close()

These examples cover a range of functionalities available in the http.client module, from basic HTTP requests to handling redirects, exceptions, and large responses. Each example includes comments to explain key steps and is designed for clarity and educational purposes.

http.cookiejar - Cookie handling for HTTP clients

The http.cookiejar module is part of Python's standard library and provides a way to handle cookies in HTTP requests. Cookies are used by websites to store user data, such as session IDs or preferences, between visits. This module allows you to manage cookie storage, parsing responses, and sending cookies with HTTP requests.

Below are comprehensive code examples for various functionalities provided by the http.cookiejar module:

1. Basic Cookie Management

import http.cookiejar

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Example of adding a cookie manually
cookie = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='1234567890',
    domain='example.com',
    path='/',
    secure=True,
    expires=1632400000  # Unix timestamp for January 1, 2021
)

cookie_jar.set_cookie(cookie)

# Print all cookies in the CookieJar
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}")

# Save cookies to a file
with open('cookies.txt', 'wb') as f:
    cookie_jar.save(file=f, ignore_discard=True, ignore_expires=False)

# Load cookies from a file
cookie_jar.clear()
cookie_jar.load('cookies.txt')

# Add another cookie from the loaded data
another_cookie = http.cookiejar.Cookie.from_string(
    "anotherCookieName=9876543210; expires=1635000000"
)
cookie_jar.set_cookie(another_cookie)

print("\nCookies after loading and adding another:")
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}")

2. Parsing HTTP Responses for Cookies

import http.cookiejar
import urllib.request

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Open a URL and handle cookies
with urllib.request.urlopen('https://example.com') as response:
    # Parse the response headers to extract cookies
    cookie_jar.extract_cookies(response, 'https://example.com')

# Print all cookies extracted from the response
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}")

3. Sending Cookies with HTTP Requests

import http.cookiejar
import urllib.request

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Open a URL and handle cookies
with urllib.request.urlopen('https://example.com') as response:
    # Parse the response headers to extract cookies
    cookie_jar.extract_cookies(response, 'https://example.com')

# Create an opener that uses our CookieJar
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar))

# Make a request using the custom opener
with opener.open('https://example.com/some_page') as response:
    print("Response from secured page:")
    print(response.read().decode())

# Note: The URL 'https://example.com' and '/some_page' should be replaced with actual URLs used in your application.

4. Handling Cookie Expiry

import http.cookiejar
import time

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Example of setting cookies with different expiry times
cookie1 = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='1234567890',
    domain='example.com',
    path='/',
    secure=True,
    expires=int(time.time() + 3600)  # Expires in 1 hour
)

cookie2 = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='9876543210',
    domain='example.com',
    path='/',
    secure=True,
    expires=int(time.time() - 3600)  # Expires in 1 hour ago
)

cookie_jar.set_cookie(cookie1)
cookie_jar.set_cookie(cookie2)

# Print all cookies, showing expiry times
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}, Expires: {cookie.expires}")

5. Handling Cookie Domain Scope

import http.cookiejar

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Example of setting cookies with different domain scopes
cookie1 = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='1234567890',
    domain='example.com',
    path='/',
    secure=True
)

cookie2 = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='9876543210',
    domain='.example.com',  # Matches subdomains
    path='/',
    secure=True
)

cookie_jar.set_cookie(cookie1)
cookie_jar.set_cookie(cookie2)

# Print all cookies, showing domain scope
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}, Domain: {cookie.domain}")

6. Handling Cookie Persistence

import http.cookiejar
import os

# Create a CookieJar object
cookie_jar = http.cookiejar.MozillaCookieJar()  # Use Mozilla format for easier reading/writing

# Example of saving cookies in a file
with open('cookies.txt', 'wb') as f:
    cookie_jar.save(file=f, ignore_discard=True, ignore_expires=False)

# Load cookies from a file
cookie_jar.clear()
cookie_jar.load('cookies.txt')

# Print all cookies after loading
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}")

7. Handling Secure Cookies

import http.cookiejar

# Create a CookieJar object
cookie_jar = http.cookiejar.CookieJar()

# Example of setting secure cookies
secure_cookie = http.cookiejar.Cookie(
    version=0,
    name='session_id',
    value='1234567890',
    domain='example.com',
    path='/',
    secure=True
)

cookie_jar.set_cookie(secure_cookie)

# Print all cookies, showing secure flag
for cookie in cookie_jar:
    print(f"Name: {cookie.name}, Value: {cookie.value}, Secure: {cookie.secure}")

These examples cover the basic functionalities of the http.cookiejar module, including creating and managing cookies, parsing responses, sending cookies with requests, handling cookie expiry, domain scope, persistence, and secure cookies. Each example is self-contained and demonstrates a specific aspect of working with HTTP cookies in Python.

http.cookies - HTTP state management.md

http.cookies - HTTP state management

The http.cookies module in Python provides a way to handle cookies sent by a client's browser, which are used for maintaining user sessions or storing data across multiple requests. Below are comprehensive and well-documented code examples for various functionalities of the http.cookies module.

Example 1: Creating a Simple Cookie

from http.cookies import SimpleCookie

# Create an instance of SimpleCookie to handle cookies
cookie = SimpleCookie()

# Set a cookie with a name, value, and expiration time
cookie['session_id'] = 'abc123'
cookie['session_id']['expires'] = 60 * 60 * 24  # Expires in one day

# Print the cookie as a string
print(cookie.output())

Example 2: Parsing a Cookie String

from http.cookies import SimpleCookie

# A sample cookie string from a browser
cookie_string = 'session_id=abc123; expires=Wed, 01 Jan 2099 00:00:00 GMT'

# Parse the cookie string into a dictionary of cookies
cookies = SimpleCookie(cookie_string)

# Access and print the value of the session_id cookie
print(cookies['session_id'].value)

Example 3: Setting Multiple Cookies

from http.cookies import SimpleCookie

# Create an instance of SimpleCookie to handle multiple cookies
cookie = SimpleCookie()

# Set multiple cookies with different names, values, and domains
cookie['user'] = 'john_doe'
cookie['user']['domain'] = '.example.com'

cookie['age'] = 30
cookie['age']['path'] = '/admin'

print(cookie.output())

Example 4: Handling Cookie Expiry

from http.cookies import SimpleCookie, CookieError

# Create an instance of SimpleCookie to handle cookies with expiration
cookie = SimpleCookie()

# Set a cookie with a name, value, and a specific expiry date
try:
    cookie['session_id'] = 'abc123'
    cookie['session_id']['expires'] = 60 * 60 * 24  # Expires in one day

    # Attempt to retrieve the expired cookie
    print(cookie['session_id'].value)
except CookieError as e:
    print(f"Cookie error: {e}")

Example 5: Setting Cookies with Secure and HttpOnly Flags

from http.cookies import SimpleCookie

# Create an instance of SimpleCookie to handle cookies with security flags
cookie = SimpleCookie()

# Set a cookie with secure flag (HTTPS only)
cookie['secure_cookie'] = 'value'
cookie['secure_cookie']['secure'] = True

# Set a cookie with HttpOnly flag (not accessible via JavaScript)
cookie['http_only_cookie'] = 'secret'
cookie['http_only_cookie']['httponly'] = True

print(cookie.output())

Example 6: Encoding and Decoding Cookies

from http.cookies import SimpleCookie, CookieError

# Create an instance of SimpleCookie to handle cookies for encoding/decoding
cookie = SimpleCookie()

# Set a cookie with a value containing special characters
cookie['special_chars'] = 'Hello, World!'
print(cookie.output())

# Decode the encoded cookie string back into a dictionary
decoded_cookie = SimpleCookie()
try:
    decoded_cookie.load(cookie.output())
    print(decoded_cookie['special_chars'].value)
except CookieError as e:
    print(f"Decoding error: {e}")

Example 7: Using Cookies in HTTP Responses

from http.cookies import SimpleCookie, Morsel

# Create an instance of SimpleCookie to handle cookies for HTTP responses
response_cookie = SimpleCookie()

# Set a cookie with a name, value, and domain for use in an HTTP response
response_cookie['session_id'] = 'abc123'
response_cookie['session_id']['domain'] = '.example.com'

# Add the cookie to the response headers
headers = {'Set-Cookie': response_cookie.output(header='', sep='')}
print(headers)

Example 8: Using Cookies in HTTP Requests

from http.cookies import SimpleCookie, Morsel

# Create an instance of SimpleCookie to handle cookies for HTTP requests
request_cookies = SimpleCookie()

# Set a cookie with a name, value, and domain for use in an HTTP request
request_cookies['session_id'] = 'abc123'
request_cookies['session_id']['domain'] = '.example.com'

# Decode the cookie string from the HTTP request header into a dictionary
try:
    decoded_request_cookies = SimpleCookie()
    decoded_request_cookies.load(request_cookies.output(header='', sep=''))
    print(decoded_request_cookies['session_id'].value)
except CookieError as e:
    print(f"Decoding error: {e}")

Example 9: Handling SameSite Attribute

from http.cookies import SimpleCookie, Morsel

# Create an instance of SimpleCookie to handle cookies with SameSite attribute
cookie = SimpleCookie()

# Set a cookie with SameSite=Lax attribute (recommended for cross-site requests)
cookie['lax_cookie'] = 'value'
cookie['lax_cookie']['samesite'] = 'Lax'

# Print the cookie with the SameSite attribute
print(cookie.output())

Example 10: Setting Cookies in a Web Server Response

from http.cookies import SimpleCookie, Morsel

# Create an instance of SimpleCookie to handle cookies for web server responses
response_cookie = SimpleCookie()

# Set a cookie with a name, value, and domain for use in a web server response
response_cookie['session_id'] = 'abc123'
response_cookie['session_id']['domain'] = '.example.com'

# Add the cookie to the response headers
headers = {'Set-Cookie': response_cookie.output(header='', sep='')}
print(headers)

These examples cover various aspects of using the http.cookies module, including creating and parsing cookies, setting multiple cookies with different attributes, handling expiry dates, and managing security flags. Each example includes comments to explain the purpose and functionality of each part of the code.

http.server - HTTP servers.md

http.server - HTTP servers

Below is a comprehensive set of code examples demonstrating various functionalities provided by the http.server module in Python 3.12. These examples cover creating simple HTTP servers, handling GET and POST requests, serving static files, and more.

Example 1: Simple HTTP Server

A basic example of setting up an HTTP server using http.server.

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Send response status code
        self.send_response(200)

        # Send headers
        self.send_header('Content-type', 'text/html')
        self.end_headers()

        # Write the HTML message
        html_message = "<html><head><title>Simple HTTP Server</title></head><body>Hello, World!</body></html>"
        self.wfile.write(html_message.encode())

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 2: Handling GET Requests

This example demonstrates handling GET requests by retrieving a query parameter.

from http.server import BaseHTTPRequestHandler, CGIHTTPRequestHandler
import cgi

class MyCGIHTTPRequestHandler(CGIHTTPRequestHandler):
    def do_GET(self):
        # Parse the URL to get parameters
        params = cgi.parse_qs(self.path[1:])

        if 'name' in params:
            name = params['name'][0]
            html_message = f"<html><head><title>GET Request Handler</title></head><body>Hello, {name}!</body></html>"
        else:
            html_message = "<html><head><title>GET Request Handler</title></head><body>Please provide a name.</body></html>"

        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html_message.encode())

def run(server_class=HTTPServer, handler_class=MyCGIHTTPRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 3: Handling POST Requests

This example demonstrates handling POST requests by processing form data.

from http.server import BaseHTTPRequestHandler, CGIHTTPRequestHandler
import cgi

class MyCGIHTTPRequestHandler(CGIHTTPRequestHandler):
    def do_POST(self):
        # Parse the form data from the request
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)

        # Parse the POST data as URL-encoded parameters
        params = cgi.parse_qs(post_data.decode())

        if 'name' in params:
            name = params['name'][0]
            html_message = f"<html><head><title>POST Request Handler</title></head><body>Hello, {name}!</body></html>"
        else:
            html_message = "<html><head><title>POST Request Handler</title></head><body>Please provide a name.</body></html>"

        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html_message.encode())

def run(server_class=HTTPServer, handler_class=MyCGIHTTPRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 4: Serving Static Files

This example demonstrates serving static files from a directory.

from http.server import BaseHTTPRequestHandler, HTTPServer

class SimpleStaticHTTPServer(BaseHTTPRequestHandler):
    def do_GET(self):
        # Serve files from the current directory
        try:
            file_path = self.path[1:]
            if not file_path:
                file_path = 'index.html'

            with open(file_path, 'rb') as f:
                content = f.read()
                self.send_response(200)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                self.wfile.write(content)
        except FileNotFoundError:
            self.send_error(404, "File not found")

def run(server_class=HTTPServer, handler_class=SimpleStaticHTTPServer, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 5: Using HTTPS

This example demonstrates setting up an HTTPS server using the http.server module with a self-signed certificate.

from http.server import BaseHTTPRequestHandler, HTTPServer
import ssl

class SimpleHTTPSRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Send response status code and headers
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

        # Write the HTML message
        html_message = "<html><head><title>HTTPS Server</title></head><body>Hello, World!</body></html>"
        self.wfile.write(html_message.encode())

def run(server_class=HTTPServer, handler_class=SimpleHTTPSRequestHandler, port=443):
    # Generate a self-signed certificate and key
    server_address = ('', port)

    # Use ssl.wrap_socket to secure the server connection
    httpd = server_class(server_address, handler_class)
    httpd.socket = ssl.wrap_socket(httpd.socket,
                                     server_side=True,
                                     certfile='server.crt',
                                     keyfile='server.key')

    print(f"Serving HTTPS on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 6: Using the http.server module with a custom handler

This example demonstrates using a custom handler class to handle requests in more complex ways.

from http.server import BaseHTTPRequestHandler, HTTPServer

class CustomRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Send response status code and headers
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

        # Handle the request based on the URL path
        if self.path == '/':
            html_message = "<html><head><title>Custom Request Handler</title></head><body>Welcome to the custom handler.</body></html>"
        else:
            html_message = f"<html><head><title>Error</title></head><body>Unknown endpoint: {self.path}</body></html>"

        self.wfile.write(html_message.encode())

def run(server_class=HTTPServer, handler_class=CustomRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Example 7: Using http.server with a multi-threaded server

This example demonstrates running an HTTP server using multiple threads to handle concurrent requests.

from http.server import BaseHTTPRequestHandler, HTTPServer, ThreadingHTTPServer

class ThreadedSimpleHTTPRequestHandler(ThreadingHTTPServer):
    def __init__(self, server_address, handler_class=BaseHTTPRequestHandler):
        super().__init__(server_address, handler_class)
        self.daemon_threads = True  # Allow threads to exit when main program exits

def run(server_class=ThreadedSimpleHTTPRequestHandler, handler_class=BaseHTTPRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving HTTP on port {port} (multi-threaded)...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()

These examples provide a comprehensive overview of the functionalities available in the http.server module. Each example is designed to be clear and self-contained, making it suitable for inclusion in official documentation or as part of a larger application.

imaplib - IMAP4 protocol client.md

imaplib - IMAP4 protocol client

The imaplib module in Python provides an interface to the IMAP4 protocol, which is used for retrieving and managing email messages on a mail server. Below are comprehensive code examples demonstrating various functionalities of the imaplib module.

1. Connecting to an IMAP Server

import imaplib

def connect_to_imap_server(server, username, password):
    """
    Connects to an IMAP server and returns an IMAP4 object.

    :param server: The IMAP server address (e.g., 'imap.example.com').
    :param username: The user's email username.
    :param password: The user's email password.
    :return: An IMAP4 object connected to the specified server.
    """
    try:
        # Connect to the IMAP server
        imap = imaplib.IMAP4_SSL(server)
        imap.login(username, password)
        print(f"Connected to {server} as {username}")
        return imap
    except Exception as e:
        print(f"Failed to connect to {server}: {e}")
        return None

# Example usage
server = 'imap.example.com'
username = 'your-email@example.com'
password = 'your-password'

imap_connection = connect_to_imap_server(server, username, password)
if imap_connection:
    # Proceed with operations
    pass

2. Listing Mailboxes (Inboxes)

def list_mailboxes(imap):
    """
    Lists all mailboxes on the server.

    :param imap: An IMAP4 object connected to an IMAP server.
    :return: A list of mailbox names.
    """
    try:
        # Select the INBOX mailbox
        status, messages = imap.select('INBOX')
        if status == 'OK':
            print("Listing mailboxes...")
            # List all available mailboxes
            return imap.list()[1]
        else:
            print(f"Failed to list mailboxes: {status}")
            return None
    except Exception as e:
        print(f"Failed to list mailboxes: {e}")
        return []

# Example usage
if imap_connection:
    mailboxes = list_mailboxes(imap_connection)
    if mailboxes:
        for mailbox in mailboxes:
            print(mailbox.decode('utf-8'))

3. Searching for Emails

def search_emails(imap, criteria):
    """
    Searches for emails based on a set of criteria.

    :param imap: An IMAP4 object connected to an IMAP server.
    :param criteria: A list of search criteria (e.g., ['FROM', 'example@example.com']).
    :return: A list of email IDs that match the criteria.
    """
    try:
        # Search for emails
        status, messages = imap.search(None, *criteria)
        if status == 'OK':
            print(f"Found {len(messages[0].split())} matching messages.")
            return messages[0].split()
        else:
            print(f"Failed to search for emails: {status}")
            return []
    except Exception as e:
        print(f"Failed to search for emails: {e}")
        return []

# Example usage
if imap_connection:
    criteria = ['FROM', 'example@example.com']
    email_ids = search_emails(imap_connection, criteria)
    if email_ids:
        for email_id in email_ids:
            print(email_id.decode('utf-8'))

4. Retrieving Emails

def retrieve_email(imap, message_id):
    """
    Retrieves an email based on its ID.

    :param imap: An IMAP4 object connected to an IMAP server.
    :param message_id: The ID of the email to retrieve.
    :return: The raw email data as bytes.
    """
    try:
        # Fetch the email
        status, email_data = imap.fetch(message_id, '(RFC822)')
        if status == 'OK':
            print(f"Email retrieved: {message_id}")
            return email_data[0][1]
        else:
            print(f"Failed to retrieve email: {status}")
            return None
    except Exception as e:
        print(f"Failed to retrieve email: {e}")
        return None

# Example usage
if imap_connection and email_ids:
    message_id = email_ids[0]  # Assume the first email ID is the one to fetch
    raw_email = retrieve_email(imap_connection, message_id)
    if raw_email:
        print(raw_email.decode('utf-8'))

5. Storing Emails (Outbox)

def store_emails(imap, folder_name, messages):
    """
    Stores email messages in a specified folder.

    :param imap: An IMAP4 object connected to an IMAP server.
    :param folder_name: The name of the folder where emails will be stored.
    :param messages: A list of raw email data as bytes.
    """
    try:
        # Select the target folder
        imap.select(folder_name)
        # Store each message
        for msg in messages:
            status, result = imap.append(folder_name, '', None, msg)
            if status == 'OK':
                print(f"Message stored in {folder_name}: {result[0].decode('utf-8')}")
            else:
                print(f"Failed to store message in {folder_name}: {status}")
    except Exception as e:
        print(f"Failed to store emails: {e}")

# Example usage
if imap_connection and email_ids:
    folder_name = 'Sent'
    messages_to_store = [raw_email for _, raw_email in enumerate(messages, 1)]  # Assume all retrieved emails are to be stored
    store_emails(imap_connection, folder_name, messages_to_store)

6. Deleting Emails

def delete_emails(imap, message_id):
    """
    Deletes an email based on its ID.

    :param imap: An IMAP4 object connected to an IMAP server.
    :param message_id: The ID of the email to delete.
    """
    try:
        # Delete the email
        status, result = imap.store(message_id, '+FLAGS', '\\Deleted')
        if status == 'OK':
            print(f"Email deleted: {message_id}")
        else:
            print(f"Failed to delete email: {status}")
    except Exception as e:
        print(f"Failed to delete email: {e}")

# Example usage
if imap_connection and email_ids:
    message_id = email_ids[0]  # Assume the first email ID is the one to delete
    delete_emails(imap_connection, message_id)

7. Expunging Deleted Emails

def expunge_deleted_emails(imap):
    """
    Expunges (deletes) all deleted emails from a mailbox.

    :param imap: An IMAP4 object connected to an IMAP server.
    """
    try:
        # Expunge all deleted emails
        status, result = imap.expunge()
        if status == 'OK':
            print("Deleted emails expunged.")
        else:
            print(f"Failed to expunge deleted emails: {status}")
    except Exception as e:
        print(f"Failed to expunge deleted emails: {e}")

# Example usage
if imap_connection and email_ids:
    expunge_deleted_emails(imap_connection)

8. Disconnecting from the Server

def disconnect_from_imap_server(imap):
    """
    Disconnects from the IMAP server.

    :param imap: An IMAP4 object connected to an IMAP server.
    """
    try:
        # Logout and close the connection
        imap.logout()
        print("Disconnected from the IMAP server.")
    except Exception as e:
        print(f"Failed to disconnect from the IMAP server: {e}")

# Example usage
if imap_connection:
    disconnect_from_imap_server(imap_connection)

These examples provide a comprehensive overview of how to use various functionalities in the imaplib module. Each example includes error handling and assumes that you have already established a connection to the IMAP server using connect_to_imap_server.

ipaddress - IPv4 IPv6 manipulation library.md

ipaddress - IPv4/IPv6 manipulation library

The ipaddress module in Python provides a way to manipulate IPv4 and IPv6 addresses and networks efficiently. Below are comprehensive and well-documented examples covering various functionalities of this module:

1. Creating an IPv4 Address

import ipaddress

# Create an IPv4 address object
ipv4_address = ipaddress.IPv4Address('192.168.1.1')

print(ipv4_address)  # Output: 192.168.1.1

2. Creating an IPv4 Network

import ipaddress

# Create an IPv4 network object
ipv4_network = ipaddress.IPv4Network('192.168.1.0/24')

print(ipv4_network)  # Output: 192.168.1.0/24

3. Checking if an IP is in a Network

import ipaddress

# Create a network and an address to check
network = ipaddress.IPv4Network('192.168.1.0/24')
address = ipaddress.IPv4Address('192.168.1.5')

if address in network:
    print(f"{address} is in the network {network}")
else:
    print(f"{address} is not in the network {network}")

4. Iterating Over an IPv4 Network

import ipaddress

# Create a network and iterate over its addresses
network = ipaddress.IPv4Network('192.168.1.0/25')

for address in network:
    print(address)

5. Creating an IPv6 Address

import ipaddress

# Create an IPv6 address object
ipv6_address = ipaddress.IPv6Address('2001:db8::1')

print(ipv6_address)  # Output: 2001:db8::1

6. Creating an IPv6 Network

import ipaddress

# Create an IPv6 network object
ipv6_network = ipaddress.IPv6Network('2001:db8::/48')

print(ipv6_network)  # Output: 2001:db8::/48

7. Checking if an IPv6 is in a Network

import ipaddress

# Create a network and an address to check
network = ipaddress.IPv6Network('2001:db8::/48')
address = ipaddress.IPv6Address('2001:db8::5')

if address in network:
    print(f"{address} is in the network {network}")
else:
    print(f"{address} is not in the network {network}")

8. Iterating Over an IPv6 Network

import ipaddress

# Create a network and iterate over its addresses
network = ipaddress.IPv6Network('2001:db8::/56')

for address in network:
    print(address)

9. Working with CIDR Notation

import ipaddress

# Parse an IPv4 address from a string and check the prefix length
ipv4_address = ipaddress.ip_address('192.168.1.1/24')
print(ipv4_address)  # Output: 192.168.1.1
print(ipv4_address.network)  # Output: 192.168.1.0/24

# Parse an IPv6 address from a string and check the prefix length
ipv6_address = ipaddress.ip_address('2001:db8::1/48')
print(ipv6_address)  # Output: 2001:db8::1
print(ipv6_address.network)  # Output: 2001:db8::/48

10. Comparing IP Addresses and Networks

import ipaddress

# Create two IPv4 addresses
ip1 = ipaddress.IPv4Address('192.168.1.1')
ip2 = ipaddress.IPv4Address('192.168.1.2')

if ip1 < ip2:
    print(f"{ip1} is less than {ip2}")
elif ip1 > ip2:
    print(f"{ip1} is greater than {ip2}")
else:
    print(f"{ip1} is equal to {ip2}")

# Create two IPv4 networks
network1 = ipaddress.IPv4Network('192.168.1.0/24')
network2 = ipaddress.IPv4Network('192.168.2.0/24')

if network1 < network2:
    print(f"{network1} is less than {network2}")
elif network1 > network2:
    print(f"{network1} is greater than {network2}")
else:
    print(f"{network1} is equal to {network2}")

11. Address and Network Classifications

import ipaddress

# Create an IPv4 address and classify it
ipv4_address = ipaddress.IPv4Address('192.168.1.1')
print(ipv4_address.is_loopback)  # Output: False
print(ipv4_address.is_multicast)  # Output: False
print(ipv4_address.is_private)  # Output: True

# Create an IPv6 address and classify it
ipv6_address = ipaddress.IPv6Address('2001:db8::1')
print(ipv6_address.is_loopback)  # Output: False
print(ipv6_address.is_multicast)  # Output: False
print(ipv6_address.is_private)  # Output: True

# Create an IPv4 network and classify it
ipv4_network = ipaddress.IPv4Network('192.168.1.0/24')
print(ipv4_network.is_link_local)  # Output: False
print(ipv4_network.is_global)  # Output: True

# Create an IPv6 network and classify it
ipv6_network = ipaddress.IPv6Network('2001:db8::/48')
print(ipv6_network.is_link_local)  # Output: True
print(ipv6_network.is_global)  # Output: False

12. Conversion between Address Types

import ipaddress

# Create an IPv4 address and convert it to an integer
ipv4_address = ipaddress.IPv4Address('192.168.1.1')
integer_value = int(ipv4_address)
print(integer_value)  # Output: 3232235777

# Convert an integer back to an IPv4 address
reversed_ipv4_address = ipaddress.IPv4Address(integer_value)
print(reversed_ipv4_address)  # Output: 192.168.1.1

13. Creating and Manipulating Masks

import ipaddress

# Create an IPv4 address with a custom mask
ipv4_address_with_mask = ipaddress.ip_address('192.168.1.1/25')
print(ipv4_address_with_mask)  # Output: 192.168.1.1/25

# Create an IPv4 network with a custom mask
ipv4_network_with_mask = ipaddress.ip_network('192.168.1.0/25')
print(ipv4_network_with_mask)  # Output: 192.168.1.0/25

# Get the subnet mask as an integer
subnet_mask = ipv4_network_with_mask.netmask
print(subnet_mask)  # Output: 4294967295 (full subnet mask)

These examples cover the basic functionalities of the ipaddress module, including creating and manipulating IPv4 and IPv6 addresses and networks, checking their properties, performing comparisons, and converting between different types.

nntplib - NNTP protocol client.md

nntplib - NNTP protocol client

The nntplib module in Python provides a straightforward interface to interact with News Transfer Protocol (NNTP) servers, which are used for retrieving news articles and other Internet newsgroups. Below are comprehensive examples of how to use the nntplib module for common operations such as connecting to an NNTP server, retrieving list of groups, listing headers, downloading articles, and closing the connection.

Example 1: Connecting to an NNTP Server

import nntplib

# Connect to an NNTP server (e.g., news.example.com)
server = nntplib.NNTP('news.example.com')

Explanation: - Import the nntplib module. - Create an instance of NNTP by passing the hostname of the NNTP server as an argument.

Example 2: Listing All Groups

# List all groups on the server
groups = server.list()
print("List of groups:", groups)

Explanation: - Use the list() method to retrieve a list of all available newsgroups on the server. - Print the result.

Example 3: Listing Headers of an Article

# Select a group and article number
group = 'comp.lang.python'
article_num = 10

# List headers of a specific article
headers = server.head(article_num)
print("Headers for article", article_num, "in group", group, "\n", headers)

Explanation: - Use the head() method to retrieve the headers of a specific article. - Specify the group and article number as arguments. - Print the headers.

Example 4: Retrieving an Article

# Retrieve and print the content of a specific article
article_content = server.article(article_num)
print("Article", article_num, "in group", group, "\n", article_content)

Explanation: - Use the article() method to retrieve the full content of a specific article. - Print the content.

Example 5: Closing the Connection

# Close the connection to the server
server.quit()
print("Connection closed.")

Explanation: - Use the quit() method to close the connection to the NNTP server.

Additional Best Practices and Considerations

  1. Error Handling: Always handle exceptions that might occur during the interaction with the NNTP server. For example, you can use a try-except block to catch errors like NNTPError which are raised if there is an issue with the connection or command execution.

  2. Resource Management: Ensure that resources are properly managed by closing the connection and deleting references to objects when they are no longer needed.

  3. Security: Be cautious about exposing your application to network connections, especially if it's running in a public environment. Consider using secure channels like SSL/TLS for communication if necessary.

  4. Documentation: Refer to the official Python documentation for nntplib (https://docs.python.org/3/library/nntplib.html) for more detailed information and advanced features.

These examples provide a basic framework for interacting with NNTP servers in Python. Depending on your specific use case, you might need to extend or modify these examples to suit your needs.

poplib - POP3 protocol client.md

poplib - POP3 protocol client

The poplib module in Python provides a convenient interface to access email messages using the Post Office Protocol (POP3). Below are comprehensive examples demonstrating various functionalities of the poplib module. These examples cover basic usage, error handling, and advanced features like retrieving specific email headers.

Example 1: Retrieving Messages

import poplib
from email.parser import BytesParser

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        # Retrieve a specific message by index
        resp, lines, octets = server.retr(i + 1)
        raw_email = b'\n'.join(lines)  # Combine lines into one string

        # Parse the email using BytesParser
        email_message = BytesParser().parse(raw_email)

        print(f"Message {i + 1}:")
        print("From:", email_message['from'])
        print("Subject:", email_message['subject'])

    # Close the connection
    server.quit()

# Note: Ensure you handle exceptions properly and close the connection to free resources.

Example 2: Deleting Messages

import poplib

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        print(f"Message {i + 1}:")
        try:
            # Delete the message by index
            server.dele(i + 1)
        except poplib.error_proto as e:
            print(f"Failed to delete message {i + 1}: {e}")

    # Close the connection
    server.quit()

Example 3: Retrieving Email Headers

import poplib
from email.parser import BytesParser

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        resp, lines, octets = server.retr(i + 1)
        raw_email = b'\n'.join(lines)

        # Parse the email using BytesParser to extract headers
        email_message = BytesParser().parse(raw_email)

        print(f"Message {i + 1}:")
        for header in email_message:
            print(header, ":", email_message[header])

    # Close the connection
    server.quit()

Example 4: Handling Multiple Messages

import poplib
from email.parser import BytesParser

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        resp, lines, octets = server.retr(i + 1)
        raw_email = b'\n'.join(lines)

        # Parse the email using BytesParser to extract headers and body
        email_message = BytesParser().parse(raw_email)

        print(f"Message {i + 1}:")
        for header in email_message:
            print(header, ":", email_message[header])

    # Close the connection
    server.quit()

Example 5: Handling Large Emails

import poplib
from email.parser import BytesParser

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        resp, lines, octets = server.retr(i + 1)
        raw_email = b'\n'.join(lines)

        # Parse the email using BytesParser to handle large emails
        email_message = BytesParser().parse(raw_email)

        print(f"Message {i + 1}:")
        for header in email_message:
            print(header, ":", email_message[header])

    # Close the connection
    server.quit()

Example 6: Error Handling and Logging

import poplib
from email.parser import BytesParser
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)

# Connect to a POP3 server (e.g., Gmail)
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    logging.error(f"Login failed: {e}")
else:
    try:
        # Retrieve all messages
        num_messages = len(server.list()[1])
        for i in range(num_messages):
            resp, lines, octets = server.retr(i + 1)
            raw_email = b'\n'.join(lines)

            # Parse the email using BytesParser
            email_message = BytesParser().parse(raw_email)

            logging.info(f"Message {i + 1}:")
            for header in email_message:
                logging.info(f"{header} : {email_message[header]}")

    except poplib.error_proto as e:
        logging.error(f"Error processing message: {e}")

    # Close the connection
    server.quit()

Example 7: Using TLS with Authentication

import poplib
from email.parser import BytesParser

# Connect to a POP3 server (e.g., Gmail) using TLS
server = poplib.POP3_SSL('pop.gmail.com', 995)

# Login to the server
username = 'your-email@gmail.com'
password = 'your-password'
try:
    server.user(username)
    server.pass_(password)
except poplib.error_proto as e:
    print(f"Login failed: {e}")
else:
    # Retrieve all messages
    num_messages = len(server.list()[1])
    for i in range(num_messages):
        resp, lines, octets = server.retr(i + 1)
        raw_email = b'\n'.join(lines)

        # Parse the email using BytesParser
        email_message = BytesParser().parse(raw_email)

        print(f"Message {i + 1}:")
        for header in email_message:
            print(header, ":", email_message[header])

    # Close the connection
    server.quit()

These examples demonstrate basic usage of the poplib module, including retrieving and parsing emails, handling exceptions, and logging messages. Each example is designed to be self-contained and includes comments for clarity.

smtplib - SMTP protocol client.md

smtplib - SMTP protocol client

Below are comprehensive code examples for using the smtplib module in Python, covering various functionalities such as sending simple emails, handling exceptions, and configuring SMTP servers with authentication.

Example 1: Sending a Simple Email Using smtplib

import smtplib
from email.mime.text import MIMEText

def send_simple_email():
    # Set up the SMTP server details
    smtp_server = 'smtp.example.com'
    port = 587
    sender_email = 'your-email@example.com'
    receiver_email = 'receiver-email@example.com'
    password = 'your-password'

    try:
        # Create a secure SSL context
        context = smtplib.SMTP(smtp_server, port)

        # Start TLS encryption
        context.starttls()

        # Log in to the SMTP server
        context.login(sender_email, password)

        # Create a MIMEText object for the email content
        message = MIMEText('Hello, this is a test email sent from Python using smtplib.')
        message['Subject'] = 'Test Email'
        message['From'] = sender_email
        message['To'] = receiver_email

        # Send the email
        context.sendmail(sender_email, receiver_email, message.as_string())

        print("Email sent successfully!")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Close the connection
        context.quit()

if __name__ == "__main__":
    send_simple_email()

Explanation:

  1. SMTP Server Setup: Define the SMTP server address, port, sender's email, receiver's email, and password.
  2. SSL Context: Create an SSL context to secure the connection.
  3. Start TLS: Establish a secure connection using TLS.
  4. Login: Authenticate with the SMTP server using the sender's credentials.
  5. Create Email Content: Use MIMEText to create a simple email message.
  6. Send Email: Send the email using context.sendmail().
  7. Error Handling and Cleanup: Include exception handling and ensure the connection is closed in a finally block.

Example 2: Sending an HTML Email Using smtplib

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def send_html_email():
    # Set up the SMTP server details
    smtp_server = 'smtp.example.com'
    port = 587
    sender_email = 'your-email@example.com'
    receiver_email = 'receiver-email@example.com'
    password = 'your-password'

    try:
        # Create a secure SSL context
        context = smtplib.SMTP(smtp_server, port)

        # Start TLS encryption
        context.starttls()

        # Log in to the SMTP server
        context.login(sender_email, password)

        # Create a MIMEMultipart object for the email content
        message = MIMEMultipart('alternative')
        message['Subject'] = 'Test HTML Email'
        message['From'] = sender_email
        message['To'] = receiver_email

        # Create and attach plain text version of the email
        text_part = MIMEText('This is a test email sent from Python using smtplib.', 'plain')
        message.attach(text_part)

        # Create and attach HTML version of the email
        html_part = MIMEText('<html><body><h1>Hello, this is a <b>test</b> email sent from Python using smtplib.</h1></body></html>', 'html')
        message.attach(html_part)

        # Send the email
        context.sendmail(sender_email, receiver_email, message.as_string())

        print("Email sent successfully!")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Close the connection
        context.quit()

if __name__ == "__main__":
    send_html_email()

Explanation:

  1. SMTP Server Setup: Similar to the simple email example.
  2. MIME Multipart: Use MIMEMultipart to create a multipart email message that can contain both plain text and HTML content.
  3. Attach Content: Attach each part of the email using attach().
  4. Error Handling and Cleanup: Same as in the simple email example.

Example 3: Sending an Email with Attachments Using smtplib

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def send_email_with_attachment():
    # Set up the SMTP server details
    smtp_server = 'smtp.example.com'
    port = 587
    sender_email = 'your-email@example.com'
    receiver_email = 'receiver-email@example.com'
    password = 'your-password'

    try:
        # Create a secure SSL context
        context = smtplib.SMTP(smtp_server, port)

        # Start TLS encryption
        context.starttls()

        # Log in to the SMTP server
        context.login(sender_email, password)

        # Create a MIMEMultipart object for the email content
        message = MIMEMultipart()
        message['Subject'] = 'Test Email with Attachment'
        message['From'] = sender_email
        message['To'] = receiver_email

        # Attach plain text version of the email
        text_part = MIMEText('This is a test email sent from Python using smtplib.', 'plain')
        message.attach(text_part)

        # Specify the file to attach
        filename = "example.txt"
        attachment_path = f"/path/to/{filename}"

        with open(attachment_path, "rb") as attachment:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(attachment.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', f"attachment; filename= {filename}")

            message.attach(part)

        # Send the email
        context.sendmail(sender_email, receiver_email, message.as_string())

        print("Email sent successfully with attachment!")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Close the connection
        context.quit()

if __name__ == "__main__":
    send_email_with_attachment()

Explanation:

  1. SMTP Server Setup: Same as previous examples.
  2. MIME Multipart: Use MIMEMultipart for email content and attachment.
  3. Attach Plain Text: Attach a plain text part to the email.
  4. Attach File: Open the file, encode it in base64, and attach it using MIMEBase.
  5. Error Handling and Cleanup: Same as previous examples.

Example 4: Sending Email with SMTP Authentication via Gmail

import smtplib
from email.mime.text import MIMEText

def send_email_via_gmail():
    # Set up the SMTP server details for Gmail
    smtp_server = 'smtp.gmail.com'
    port = 587
    sender_email = 'your-email@gmail.com'
    receiver_email = 'receiver-email@example.com'
    password = 'your-app-password'

    try:
        # Create a secure SSL context
        context = smtplib.SMTP(smtp_server, port)

        # Start TLS encryption
        context.starttls()

        # Log in to the SMTP server with Gmail's credentials
        context.login(sender_email, password)

        # Create a MIMEText object for the email content
        message = MIMEText('Hello, this is a test email sent from Python using smtplib via Gmail.')
        message['Subject'] = 'Test Email via Gmail'
        message['From'] = sender_email
        message['To'] = receiver_email

        # Send the email
        context.sendmail(sender_email, receiver_email, message.as_string())

        print("Email sent successfully!")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Close the connection
        context.quit()

if __name__ == "__main__":
    send_email_via_gmail()

Explanation:

  1. SMTP Server Setup: For Gmail, specify 'smtp.gmail.com' and use port 587.
  2. Gmail App Password: Use a 2FA app password instead of your regular email password.
  3. Login: Log in using the sender's Gmail credentials.

These examples cover basic functionality for sending emails using smtplib, including simple text, HTML, attachments, and handling SMTP authentication for popular services like Gmail. Adjust the server details and credentials as needed for your specific use case.

urllib - URL handling modules.md

urllib - URL handling modules

The urllib module in Python provides a variety of functions to handle URLs. Below are comprehensive, well-documented code examples covering various functionalities within this module.

1. urllib.request Module

This module contains functions to open and read from URLs, and to handle errors that may occur during the process.

Example 1: Using urlopen to Retrieve a Web Page

import urllib.request

def fetch_web_page(url):
    """
    Fetches the content of a web page using urllib.request.urlopen.

    Args:
    url (str): The URL of the web page to retrieve.

    Returns:
    str: The content of the web page as a string.
    """
    try:
        # Open the URL and read its contents
        with urllib.request.urlopen(url) as response:
            html_content = response.read()

        return html_content.decode('utf-8')  # Decode from bytes to string

    except urllib.error.URLError as e:
        print(f"Error fetching {url}: {e.reason}")
        return None

# Example usage
url = 'https://www.example.com'
content = fetch_web_page(url)
if content:
    print(content[:100])  # Print the first 100 characters of the page

Example 2: Handling Redirects with urlopen

import urllib.request

def fetch_web_page_with_redirects(url):
    """
    Fetches a web page and handles redirects using urllib.request.urlopen.

    Args:
    url (str): The URL of the web page to retrieve.

    Returns:
    str: The content of the final destination page as a string.
    """
    try:
        # Open the URL and handle redirects
        with urllib.request.urlopen(url) as response:
            html_content = response.read()

        return html_content.decode('utf-8')

    except urllib.error.HTTPError as e:
        print(f"HTTP error occurred: {e.code} - {e.reason}")
        return None
    except urllib.error.URLError as e:
        print(f"URL error occurred: {e.reason}")
        return None

# Example usage
url = 'https://www.example.com/redirect-target'
content = fetch_web_page_with_redirects(url)
if content:
    print(content[:100])

2. urllib.parse Module

This module provides functions to parse URLs and manage query parameters.

Example 3: Parsing a URL

import urllib.parse

def parse_url(url):
    """
    Parses a URL using urllib.parse.urlparse.

    Args:
    url (str): The URL to be parsed.

    Returns:
    tuple: A named tuple containing the components of the URL.
    """
    # Parse the URL into its components
    parsed_url = urllib.parse.urlparse(url)

    return parsed_url

# Example usage
url = 'https://www.example.com/path?query=param&another=2'
parsed = parse_url(url)
print(parsed)

Example 4: Encoding Query Parameters

import urllib.parse

def encode_query_params(params):
    """
    Encodes query parameters into a URL-encoded string using urllib.parse.urlencode.

    Args:
    params (dict): A dictionary of key-value pairs to be encoded.

    Returns:
    str: The URL-encoded query string.
    """
    # Encode the parameters
    encoded_params = urllib.parse.urlencode(params)

    return encoded_params

# Example usage
params = {'key': 'value', 'another_key': 2}
encoded = encode_query_params(params)
print(encoded)

3. urllib.error Module

This module provides exception classes for errors that may occur during URL operations.

Example 5: Handling URLError and HTTPError

import urllib.request

def handle_url_errors(url):
    """
    Handles potential URLError and HTTPError exceptions using urllib.request.urlopen.

    Args:
    url (str): The URL to be retrieved.

    Returns:
    str: The content of the web page as a string if successful, None otherwise.
    """
    try:
        # Open the URL
        with urllib.request.urlopen(url) as response:
            html_content = response.read()

        return html_content.decode('utf-8')

    except urllib.error.HTTPError as e:
        print(f"HTTP error occurred: {e.code} - {e.reason}")
        return None
    except urllib.error.URLError as e:
        print(f"URL error occurred: {e.reason}")
        return None

# Example usage
url = 'https://www.example.com/nonexistent-page'
content = handle_url_errors(url)
if content:
    print(content[:100])

4. urllib.robotparser Module

This module provides functions to parse and understand the robots.txt files that specify which parts of a website can be accessed by web robots.

Example 6: Parsing robots.txt

import urllib.robotparser

def parse_robots_file(url):
    """
    Parses a `robots.txt` file using urllib.robotparser.RobotFileParser.

    Args:
    url (str): The URL to the `robots.txt` file.

    Returns:
    RobotFileParser: An instance of RobotFileParser that can be queried.
    """
    # Parse the `robots.txt` file
    rp = urllib.robotparser.RobotFileParser()
    rp.set_url(url)
    rp.read()

    return rp

# Example usage
url = 'https://www.example.com/robots.txt'
rp = parse_robots_file(url)
print(f"Allowed user agents: {rp.allowed_user_agents()}")

5. urllib.robotparser Module - Querying Permissions

import urllib.robotparser

def check_robot_permission(rp, user_agent, path):
    """
    Checks if a specific user agent can access a given path based on the `robots.txt` file.

    Args:
    rp (RobotFileParser): An instance of RobotFileParser.
    user_agent (str): The user agent to query.
    path (str): The URL path to check.

    Returns:
    bool: True if the user agent is allowed to access the path, False otherwise.
    """
    # Check if the user agent can access the path
    return rp.can_fetch(user_agent, path)

# Example usage
rp = parse_robots_file('https://www.example.com/robots.txt')
user_agent = 'MyUserAgent'
path = '/'
if check_robot_permission(rp, user_agent, path):
    print(f"User Agent {user_agent} is allowed to access {path}")
else:
    print(f"User Agent {user_agent} is not allowed to access {path}")

These examples demonstrate how to use various functionalities within the urllib module to handle URL requests, parse URLs and query parameters, manage errors, and interact with robots.txt files.

urllib.error - Exception classes raised by urllib.request.md

urllib.error - Exception classes raised by urllib.request

The urllib.error module contains a set of exception classes that are raised by the urllib.request module when an error occurs during HTTP request processing, such as failed connections or invalid responses. Below are comprehensive code examples for each exception class in this module:

import urllib.request

# Example 1: URLError
try:
    # Attempt to open a URL that does not exist (this will raise an error)
    response = urllib.request.urlopen("https://nonexistent-url.com")
except urllib.error.URLError as e:
    print(f"URLError occurred: {e.reason}")

# Explanation:
# URLError is raised when there was an error during the actual HTTP request.
# It can be caused by network issues, invalid URLs, or other problems with the connection.

# Example 2: HTTPError
try:
    # Attempt to open a URL that returns an error status code (e.g., 404 Not Found)
    response = urllib.request.urlopen("https://www.example.com/does-not-exist")
except urllib.error.HTTPError as e:
    print(f"HTTPError occurred with status {e.code}: {e.reason}")

# Explanation:
# HTTPError is raised when the server responds with an error status code.
# It contains information about the specific error, including the status code and a reason message.

# Example 3: ContentTooLongError
try:
    # Attempt to open a URL that returns a very large response (e.g., over a specified limit)
    response = urllib.request.urlopen("https://example.com/large-file")
except urllib.error.ContentTooLongError as e:
    print(f"ContentTooLongError occurred with length {e.length}: {e.message}")

# Explanation:
# ContentTooLongError is raised when the server sends back a response that exceeds a specified maximum size.
# It provides details about the content length and an optional message.

# Example 4: ReadTimeoutError
try:
    # Attempt to open a URL with a read timeout (e.g., more than 5 seconds)
    urllib.request.urlopen("https://example.com", timeout=5)
except urllib.error.ReadTimeoutError as e:
    print(f"ReadTimeoutError occurred after {e.timeout} seconds: {e.reason}")

# Explanation:
# ReadTimeoutError is raised when the connection to the server times out before the request can complete.
# It includes the timeout duration and a reason message.

# Example 5: FTPError
try:
    # Attempt to open an FTP URL (this will raise an error)
    urllib.request.urlopen("ftp://example.com")
except urllib.error.FTPError as e:
    print(f"FTPError occurred: {e.reason}")

# Explanation:
# FTPError is raised when there was an error during the FTP request.
# It can be caused by network issues or invalid FTP URLs.

# Example 6: SocketError
try:
    # Attempt to open a URL that requires a proxy (this will raise an error)
    proxy = urllib.request.ProxyHandler({'http': 'http://proxy.example.com'})
    opener = urllib.request.build_opener(proxy)
    response = opener.open("http://example.com")
except urllib.error.SocketError as e:
    print(f"SocketError occurred: {e.strerror}")

# Explanation:
# SocketError is raised when there was an error establishing a socket connection.
# It includes the error message, which can be useful for debugging network issues.

# Example 7: IncompleteRead
try:
    # Attempt to open a URL and read only part of the content (this will raise an error)
    response = urllib.request.urlopen("https://example.com/large-file")
    data = response.read(1024)  # Read only 1024 bytes
except urllib.error.IncompleteRead as e:
    print(f"IncompleteRead occurred: {e.partial} out of {e.length} expected")

# Explanation:
# IncompleteRead is raised when the server sends a partial response, and the client expects a full one.
# It includes the amount of data read so far and the total expected length.

# Example 8: HTTPError with custom message
try:
    # Attempt to open a URL that returns an error status code (e.g., 403 Forbidden)
    response = urllib.request.urlopen("https://www.example.com/forbidden")
except urllib.error.HTTPError as e:
    print(f"HTTPError occurred with status {e.code}: {e.reason}")
    custom_message = "Access denied"
    if str(e) != custom_message:
        raise urllib.error.HTTPError(e.url, e.code, custom_message, None, e.hdrs)

# Explanation:
# Custom error messages can be added to HTTPError by creating a new exception instance.
# This allows for more detailed error handling and logging.

# Example 9: URLError with custom message
try:
    # Attempt to open a URL that does not exist (this will raise an error)
    response = urllib.request.urlopen("https://nonexistent-url.com")
except urllib.error.URLError as e:
    print(f"URLError occurred: {e.reason}")
    custom_message = "URL not found"
    if str(e) != custom_message:
        raise urllib.error.URLError(custom_message)

# Explanation:
# Custom error messages can be added to URLError by creating a new exception instance.
# This allows for more detailed error handling and logging.

# Example 10: ContentTooLongError with custom message
try:
    # Attempt to open a URL that returns a very large response (e.g., over a specified limit)
    response = urllib.request.urlopen("https://example.com/large-file")
except urllib.error.ContentTooLongError as e:
    print(f"ContentTooLongError occurred with length {e.length}: {e.message}")
    custom_message = "File too large"
    if str(e) != custom_message:
        raise urllib.error.ContentTooLongError(e.url, e.code, custom_message, None, e.hdrs)

# Explanation:
# Custom error messages can be added to ContentTooLongError by creating a new exception instance.
# This allows for more detailed error handling and logging.

These examples demonstrate how to handle various exceptions that might occur when using the urllib.request module. Each example includes comments explaining the purpose of the code, what exceptions are handled, and how custom messages can be added to improve error reporting. These examples are suitable for inclusion in official documentation or as a reference guide for developers working with Python's standard library networking utilities.

urllib.parse - Parse URLs into components.md

urllib.parse - Parse URLs into components

Here are comprehensive examples of how to use the urllib.parse module in Python, including how to parse URLs into components:

import urllib.parse

# Example 1: Parsing a simple URL
url = "http://example.com/path?query=param"
parsed_url = urllib.parse.urlparse(url)

print("Scheme:", parsed_url.scheme)      # Output: http
print("Netloc:", parsed_url.netloc)    # Output: example.com
print("Path:", parsed_url.path)        # Output: /path
print("Params:", parsed_url.params)     # Output: ''
print("Query:", parsed_url.query)       # Output: query=param
print("Fragment:", parsed_url.fragment)   # Output: ''

# Example 2: Parsing a URL with IPv6
url_ipv6 = "http://[2001:db8::1]/path?query=param"
parsed_ipv6_url = urllib.parse.urlparse(url_ipv6)

print("Scheme:", parsed_ipv6_url.scheme)   # Output: http
print("Netloc:", parsed_ipv6_url.netloc)  # Output: [2001:db8::1]
print("Path:", parsed_ipv6_url.path)     # Output: /path
print("Params:", parsed_ipv6_url.params)    # Output: ''
print("Query:", parsed_ipv6_url.query)   # Output: query=param
print("Fragment:", parsed_ipv6_url.fragment)# Output: ''

# Example 3: Parsing a URL with username and password
url_user_pass = "http://user:password@example.com/path?query=param"
parsed_user_pass_url = urllib.parse.urlparse(url_user_pass)

print("Scheme:", parsed_user_pass_url.scheme) # Output: http
print("Netloc:", parsed_user_pass_url.netloc)  # Output: user:password@example.com
print("Path:", parsed_user_pass_url.path)     # Output: /path
print("Params:", parsed_user_pass_url.params)    # Output: ''
print("Query:", parsed_user_pass_url.query)   # Output: query=param
print("Fragment:", parsed_user_pass_url.fragment)# Output: ''

# Example 4: Parsing a URL with multiple query parameters
url_params = "http://example.com/path?query1=value1&query2=value2"
parsed_params_url = urllib.parse.urlparse(url_params)

print("Scheme:", parsed_params_url.scheme) # Output: http
print("Netloc:", parsed_params_url.netloc)  # Output: example.com
print("Path:", parsed_params_url.path)     # Output: /path
print("Params:", parsed_params_url.params)    # Output: ''
print("Query:", parsed_params_url.query)   # Output: query1=value1&query2=value2
print("Fragment:", parsed_params_url.fragment)# Output: ''

# Example 5: Parsing a URL with fragment identifier
url_fragment = "http://example.com/path?query=param#fragment"
parsed_fragment_url = urllib.parse.urlparse(url_fragment)

print("Scheme:", parsed_fragment_url.scheme)   # Output: http
print("Netloc:", parsed_fragment_url.netloc)  # Output: example.com
print("Path:", parsed_fragment_url.path)     # Output: /path
print("Params:", parsed_fragment_url.params)    # Output: ''
print("Query:", parsed_fragment_url.query)   # Output: query=param
print("Fragment:", parsed_fragment_url.fragment)# Output: fragment

# Example 6: Parsing a URL with port number
url_port = "http://example.com:8080/path?query=param"
parsed_port_url = urllib.parse.urlparse(url_port)

print("Scheme:", parsed_port_url.scheme)   # Output: http
print("Netloc:", parsed_port_url.netloc)  # Output: example.com:8080
print("Path:", parsed_port_url.path)     # Output: /path
print("Params:", parsed_port_url.params)    # Output: ''
print("Query:", parsed_port_url.query)   # Output: query=param
print("Fragment:", parsed_port_url.fragment)# Output: ''

# Example 7: Parsing a URL with username and password using the urlunparse function
parsed_url = urllib.parse.urlparse(url)
url_unparsed = urllib.parse.urlunparse(parsed_url)

print("Original URL:", url)          # Output: http://example.com/path?query=param
print("Unparsed URL:", url_unparsed)# Output: http://example.com/path?query=param

# Example 8: Parsing a URL with multiple query parameters using the urlencode function
query_dict = {'key1': 'value1', 'key2': 'value2'}
encoded_query = urllib.parse.urlencode(query_dict)

print("Encoded Query:", encoded_query) # Output: key1=value1&key2=value2

# Example 9: Parsing a URL with fragment identifier using the urljoin function
base_url = "http://example.com/path"
fragment_url = "#fragment"
joined_url = urllib.parse.urljoin(base_url, fragment_url)

print("Joined URL:", joined_url)   # Output: http://example.com/path#fragment

# Example 10: Parsing a URL with IPv6 using the quote function
ipv6_url = "http://[2001:db8::1]/path?query=param"
quoted_ipv6_url = urllib.parse.quote(ipv6_url)

print("Quoted IPv6 URL:", quoted_ipv6_url) # Output: http%3A%2F%255B2001%3Ab8%3A0000%3A0000%3A0000%3A0000%3A0000%3A0001%5D%2Fpath%3Fquery%3Dparam

These examples demonstrate various ways to parse URLs using the urllib.parse module, including handling different components of a URL such as scheme, netloc, path, query parameters, and fragment identifiers. The code also includes examples for parsing URLs with IPv6 addresses, port numbers, and username/password credentials. Additionally, it shows how to encode and join URLs using the provided functions.

urllib.request - Extensible library for opening URLs.md

urllib.request - Extensible library for opening URLs

The urllib.request module in Python provides a robust set of tools for making HTTP requests and handling various protocols, including file:// and http/https. Below are comprehensive code examples that demonstrate common use cases for this module, including how to open URLs, handle responses, manage cookies, and make POST requests.

1. Opening a URL

import urllib.request

# Example: Open a URL and print the response content
url = 'http://example.com'
response = urllib.request.urlopen(url)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

2. Handling Cookies

import urllib.request

# Example: Open a URL and handle cookies
req = urllib.request.Request('http://example.com')
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor())
response = opener.open(req)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

3. Making a POST Request

import urllib.request
import urllib.parse

# Example: Make a POST request with data
url = 'http://example.com/api/data'
data = {'key1': 'value1', 'key2': 'value2'}
encoded_data = urllib.parse.urlencode(data).encode('utf-8')

req = urllib.request.Request(url, encoded_data)
response = urllib.request.urlopen(req)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

4. Using a Timeout

import urllib.request

# Example: Set a timeout for opening a URL
url = 'http://example.com'
try:
    with urllib.request.urlopen(url, timeout=5) as response:
        content = response.read().decode('utf-8')
        print(content)
except urllib.error.URLError as e:
    if hasattr(e, 'reason'):
        print(f"Server error: {e.reason}")
    elif hasattr(e, 'code'):
        print(f"HTTP error code: {e.code}")

5. Handling Redirects

import urllib.request

# Example: Follow redirects when opening a URL
url = 'http://example.com/redirect'
response = urllib.request.urlopen(url)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

6. Using a User-Agent

import urllib.request

# Example: Use a custom user-agent when opening a URL
url = 'http://example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
req = urllib.request.Request(url, headers=headers)

response = urllib.request.urlopen(req)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

7. Handling HTTP Errors

import urllib.request

# Example: Handle HTTP errors when opening a URL
url = 'http://example.com/404'
try:
    with urllib.request.urlopen(url) as response:
        content = response.read().decode('utf-8')
        print(content)
except urllib.error.HTTPError as e:
    print(f"HTTP error code: {e.code}")

8. Writing to a Local File

import urllib.request

# Example: Write the contents of a URL to a local file
url = 'http://example.com'
filename = 'output.txt'

with urllib.request.urlopen(url) as response:
    with open(filename, 'wb') as file:
        file.write(response.read())

print(f"Data written to {filename}")

9. Using Proxy

import urllib.request

# Example: Use a proxy when opening a URL
proxy_url = 'http://127.0.0.1:8080'
proxies = {'http': proxy_url, 'https': proxy_url}
opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxies))
response = opener.open('http://example.com')

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

10. Using HTTPS

import urllib.request

# Example: Open a URL over HTTPS
url = 'https://example.com'
response = urllib.request.urlopen(url)

# Read and decode the response content
content = response.read().decode('utf-8')

print(content)

These examples cover various aspects of using urllib.request, providing a comprehensive guide to opening URLs, handling responses, managing cookies, making POST requests, and more. Each example includes comments to explain each step and is suitable for inclusion in official documentation.

urllib.response - Response classes used by urllib.md

urllib.response - Response classes used by urllib

The urllib module in Python is a comprehensive set of modules that provide tools for interacting with URLs. The response submodule contains several response classes used by the urllib modules to handle HTTP responses. These classes are part of the http.client module, which provides an interface to HTTP clients.

Below are examples demonstrating various functionalities related to the Response classes in the urllib.response module:

import urllib.request

def fetch_url(url):
    try:
        # Create a request object using urlopen with default settings
        response = urllib.request.urlopen(url)

        # Read the content of the response
        content = response.read()

        # Print the length of the content
        print(f"Content length: {len(content)} bytes")

        # Decode the content to a string
        decoded_content = content.decode('utf-8')
        print("Decoded Content:")
        print(decoded_content)
    except urllib.error.URLError as e:
        # Handle errors that occur during the request
        print(f"An error occurred: {e.reason}")
    finally:
        # Close the response to free up resources
        if response:
            response.close()

# Example usage of fetch_url function
fetch_url("https://www.example.com")

Explanation:

  1. Importing urllib.request:
  2. This module provides a high-level interface for opening URLs and retrieving data from them.

  3. Function fetch_url(url):

  4. Takes a URL as input.
  5. Uses urllib.request.urlopen() to open the URL. This function returns an HTTPResponse object.
  6. Reads the content of the response using the .read() method, which returns bytes data.
  7. Decodes the content from bytes to a string using UTF-8 encoding and prints it.

  8. Error Handling:

  9. The try-except block catches any URLError that might occur during the request (e.g., network issues).
  10. Prints an error message if an exception is caught.

  11. Resource Management:

  12. The finally block ensures that the response is closed using .close(), even if an error occurs, to free up system resources.

Additional Features:

def fetch_url_with_details(url):
    try:
        response = urllib.request.urlopen(url)

        # Get the HTTP status code
        http_status_code = response.getcode()
        print(f"HTTP Status Code: {http_status_code}")

        # Get and print all headers
        headers = response.getheaders()
        for header, value in headers:
            print(f"{header}: {value}")
    except urllib.error.URLError as e:
        print(f"An error occurred: {e.reason}")
    finally:
        if response:
            response.close()

# Example usage of fetch_url_with_details function
fetch_url_with_details("https://www.example.com")
def stream_data(url):
    try:
        response = urllib.request.urlopen(url)

        # Read and print each line of the response
        while True:
            line = response.readline()
            if not line:
                break
            print(line.decode('utf-8'), end='')
    except urllib.error.URLError as e:
        print(f"An error occurred: {e.reason}")
    finally:
        if response:
            response.close()

# Example usage of stream_data function
stream_data("https://www.example.com")

These examples demonstrate the basic functionalities of using the Response classes in the urllib.response module, including how to handle requests, access response details, and manage resources effectively.

urllib.robotparser - Parser for robots.txt.md

urllib.robotparser - Parser for robots.txt

The urllib.robotparser module is part of Python's standard library, and it provides tools to parse a robots.txt file, which specifies rules about which web pages search engines should or should not index. Below are comprehensive code examples that demonstrate various functionalities provided by the urllib.robotparser module.

1. Checking Robots.txt for Disallowed Paths

from urllib.robotparser import RobotFileParser

def check_disallowed_paths(url):
    # Create a RobotFileParser instance and set the URL of the robots.txt file
    robot_file = RobotFileParser()
    robot_file.set_url(url)

    # Read the robots.txt file
    robot_file.read()

    # Define the URLs you want to check
    urls_to_check = [
        "http://example.com/page1",
        "http://example.com/page2",
        "http://example.com/disallowed-page"
    ]

    # Check which URLs are allowed or disallowed
    for url in urls_to_check:
        if robot_file.can_fetch('*', url):
            print(f"Allowed: {url}")
        else:
            print(f"Disallowed: {url}")

# Example usage
check_disallowed_paths("http://example.com/robots.txt")

2. Handling Different User Agents

from urllib.robotparser import RobotFileParser

def check_user_agent(url, user_agent):
    # Create a RobotFileParser instance and set the URL of the robots.txt file
    robot_file = RobotFileParser()
    robot_file.set_url(url)

    # Read the robots.txt file
    robot_file.read()

    # Check if the specified user agent can access the page
    if robot_file.can_fetch(user_agent, url):
        print(f"User-Agent: {user_agent} - Allowed to access {url}")
    else:
        print(f"User-Agent: {user_agent} - Disallowed from accessing {url}")

# Example usage
check_user_agent("http://example.com/robots.txt", "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")

3. Monitoring Changes to Robots.txt

from urllib.robotparser import RobotFileParser, parse_robot_file
import time

def monitor_robots_txt(url):
    # Create a RobotFileParser instance and set the URL of the robots.txt file
    robot_file = RobotFileParser()
    robot_file.set_url(url)

    # Read the initial robots.txt file
    robot_file.read()

    # Store the parsed rules in a dictionary for later comparison
    initial_rules = parse_robot_file(robot_file.get_url())

    try:
        while True:
            # Wait for 10 seconds before checking again
            time.sleep(10)

            # Read the updated robots.txt file
            robot_file.read()

            # Parse the updated rules
            updated_rules = parse_robot_file(robot_file.get_url())

            # Compare the initial and updated rules
            if initial_rules != updated_rules:
                print("robots.txt has been updated.")
                initial_rules = updated_rules

    except KeyboardInterrupt:
        print("Monitoring stopped.")

# Example usage
monitor_robots_txt("http://example.com/robots.txt")

4. Parsing Robots.txt for Disallowed Paths with a List of URLs

from urllib.robotparser import RobotFileParser

def check_disallowed_paths_for_list(urls):
    # Create a RobotFileParser instance
    robot_file = RobotFileParser()

    # Define the URL of the robots.txt file
    url = "http://example.com/robots.txt"
    robot_file.set_url(url)

    # Read the robots.txt file
    robot_file.read()

    # Check which URLs are allowed or disallowed
    for url in urls:
        if robot_file.can_fetch('*', url):
            print(f"Allowed: {url}")
        else:
            print(f"Disallowed: {url}")

# Example usage
urls = [
    "http://example.com/page1",
    "http://example.com/page2",
    "http://example.com/disallowed-page"
]
check_disallowed_paths_for_list(urls)

5. Handling Custom Paths in Robots.txt

from urllib.robotparser import RobotFileParser

def check_custom_path(url):
    # Create a RobotFileParser instance and set the URL of the robots.txt file
    robot_file = RobotFileParser()
    robot_file.set_url(url)

    # Read the robots.txt file
    robot_file.read()

    # Define the path you want to check
    path_to_check = "/page1"

    # Check if the specified path is allowed or disallowed
    if robot_file.can_fetch('*', path_to_check):
        print(f"Path: {path_to_check} - Allowed")
    else:
        print(f"Path: {path_to_check} - Disallowed")

# Example usage
check_custom_path("http://example.com/robots.txt")

These examples demonstrate how to use the urllib.robotparser module to parse and check robots.txt files for access control. Each example includes comments explaining key steps and is designed to be clear and self-contained, suitable for integration into larger applications or documentation.

webbrowser - Convenient web-browser controller.md

webbrowser - Convenient web-browser controller

The webbrowser module in Python is a convenient interface to allow you to control web browsers from within your applications. It provides a way to open URLs, search engines, and other web-based services without requiring users to manually interact with their web browsers. Below are comprehensive examples for each functionality provided by the webbrowser module:

1. Opening a URL

import webbrowser

# Open a specific URL in the default web browser
url = "https://www.example.com"
webbrowser.open(url)

Explanation:

2. Opening a URL using a specific browser

import webbrowser

# Open a specific URL using Google Chrome
url = "https://www.example.com"
chrome_path = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe %s"

webbrowser.get(chrome_path).open(url)

Explanation:

3. Opening a URL in a new tab of an existing window

import webbrowser

# Open a specific URL in a new tab of the default web browser
url = "https://www.example.com"
webbrowser.open_new_tab(url)

Explanation:

4. Opening a URL in a new window

import webbrowser

# Open a specific URL in a new window of the default web browser
url = "https://www.example.com"
webbrowser.open_new(url)

Explanation:

5. Searching for a query using a search engine

import webbrowser

# Search for a query using Google's search engine
query = "Python programming"
webbrowser.get("http://www.google.com/search?q=").open(query)

Explanation:

6. Opening a URL in an external application

import webbrowser

# Open a specific URL using an external application (e.g., Notepad)
url = "https://www.example.com"
webbrowser.get("notepad.exe").open(url)

Explanation:

7. Getting all available web browsers

import webbrowser

# Get a list of all available web browsers
browsers = webbrowser.browsers()

for browser in browsers:
    print(f"Name: {browser.name}, Executable: {browser.executable}")

Explanation:

8. Handling exceptions

import webbrowser

# Attempt to open a URL and handle exceptions if needed
try:
    url = "https://www.example.com"
    webbrowser.open(url)
except Exception as e:
    print(f"An error occurred: {e}")

Explanation:

These examples cover various functionalities provided by the webbrowser module, demonstrating how to open URLs, specify browsers, and handle different scenarios. You can use these examples as a starting point for your applications that need to interact with web browsers.

wsgiref - WSGI Utilities and Reference Implementation.md

wsgiref - WSGI Utilities and Reference Implementation

The wsgiref module in Python provides utilities and a reference implementation of the Web Server Gateway Interface (WSGI), which is a specification that defines how web servers can communicate with web applications. This module is particularly useful for developers who want to understand or implement WSGI-compliant frameworks.

Here are comprehensive code examples for various functionalities provided by the wsgiref module:

1. Simple WSGI Application

# Import necessary modules from wsgiref
from wsgiref.simple_server import make_server, demo_app

def hello_world(environ, start_response):
    # Define the response headers and status code
    status = '200 OK'
    headers = [('Content-Type', 'text/plain')]

    # Start the response with the status and headers
    start_response(status, headers)

    # Return a simple message
    return [b"Hello, World!"]

# Set up a simple WSGI server to run the application
httpd = make_server('', 8000, hello_world)
print("Serving on port 8000...")

# Serve requests indefinitely until manually stopped
httpd.serve_forever()

Explanation: - Importing Modules: The wsgiref.simple_server module provides tools for creating a simple WSGI server and an example application. - WSGI Application Function: The hello_world function defines the logic of the application. It takes two parameters: environ, which is a dictionary containing details about the request, and start_response, which is used to send back the response headers and status code. - Starting the Server: A simple server instance is created using make_server, specifying an empty string for the host and 8000 as the port. The application function hello_world is passed to this server. - Running the Server: The server starts serving requests indefinitely, displaying a message in the console.

2. Debugging WSGI Applications

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

def debug_app(environ, start_response):
    # Set up testing defaults to simulate an environment
    setup_testing_defaults(environ)

    # Define the response headers and status code
    status = '200 OK'
    headers = [('Content-Type', 'text/plain')]

    # Start the response with the status and headers
    start_response(status, headers)

    # Return a simple message
    return [b"Debugging WSGI Application"]

# Set up a simple WSGI server to run the application
httpd = make_server('', 8001, debug_app)
print("Debugging server on port 8001...")

# Serve requests indefinitely until manually stopped
httpd.serve_forever()

Explanation: - Setup Testing Defaults: This function sets up a testing environment for the WSGI application, which is useful for debugging and development purposes. - Debugging Application Logic: The debug_app function uses setup_testing_defaults to configure the request environment, ensuring that it behaves like an actual HTTP request.

3. Parsing WSGI Environment

from wsgiref.util import setup_testing_defaults

def parse_env(environ):
    # Set up testing defaults to simulate an environment
    setup_testing_defaults(environ)

    # Print the parsed environment variables and headers
    for key, value in environ.items():
        print(f"{key}: {value}")

# Create a WSGI environment dictionary
env = {}

# Parse the environment
parse_env(env)

Explanation: - Setup Testing Defaults: This function prepares the environment to simulate a web request. - Parsing Environment Variables and Headers: The parse_env function iterates over all key-value pairs in the environ dictionary and prints them. This is useful for understanding how the WSGI environment is structured.

4. Example of an Application using Request Parsing

from wsgiref.simple_server import make_server, demo_app

def request_processing(environ, start_response):
    # Set up testing defaults to simulate an environment
    setup_testing_defaults(environ)

    # Extract the query string and parse it
    query_string = environ.get('QUERY_STRING')
    params = dict(query_string.split('&'))

    # Define the response headers and status code
    status = '200 OK'
    headers = [('Content-Type', 'text/plain')]

    # Start the response with the status and headers
    start_response(status, headers)

    # Process parameters and return a response
    if params.get('param1') == 'value1':
        return [b"Parameter matched!"]
    else:
        return [b"Parameter not matched."]

# Set up a simple WSGI server to run the application
httpd = make_server('', 8002, request_processing)
print("Request processing server on port 8002...")

# Serve requests indefinitely until manually stopped
httpd.serve_forever()

Explanation: - Query String Parsing: The request_processing function extracts the query string from the environment and splits it into key-value pairs using split('&'). - Processing Parameters: It checks if a specific parameter (param1) matches a given value (value1) and returns a response accordingly.

These examples cover basic functionalities of the wsgiref module, demonstrating how to set up a simple WSGI server, handle requests, parse environment variables, and process query strings. These can be useful for understanding the structure and functionality of WSGI applications in Python.

xmlrpc - XMLRPC server and client modules.md

xmlrpc - XMLRPC server and client modules

The xmlrpc module in Python is a part of the Standard Library and provides support for making XML-RPC requests and responses. Below are comprehensive code examples that demonstrate various functionalities within this module, including creating an XML-RPC server, handling XML-RPC requests, and using an XML-RPC client to communicate with an XML-RPC server.

1. Creating an XML-RPC Server

This example demonstrates how to create a basic XML-RPC server using the SimpleXMLRPCServer class from the xmlrpc.server module.

from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    """Add two numbers."""
    return x + y

def subtract(x, y):
    """Subtract two numbers."""
    return x - y

def multiply(x, y):
    """Multiply two numbers."""
    return x * y

def divide(x, y):
    """Divide two numbers. Returns None if division by zero is attempted."""
    if y == 0:
        raise Exception("Cannot divide by zero")
    return x / y

# Create an XML-RPC server instance on port 8000
server = SimpleXMLRPCServer(("localhost", 8000))

# Register functions to the server
server.register_function(add, "add")
server.register_function(subtract, "subtract")
server.register_function(multiply, "multiply")
server.register_function(divide, "divide")

# Start the XML-RPC server loop
print("Starting server...")
server.serve_forever()

2. Handling XML-RPC Requests

This example shows how to handle requests received by the XML-RPC server.

from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    """Add two numbers."""
    return x + y

# Create an instance of SimpleXMLRPCServer and register functions
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, "add")

# Define a custom exception handler to log errors
def handle_exception(exc, value, tb):
    print(f"Error: {exc}, {value}")

server.set_exception_handler(handle_exception)

# Start the server
print("Starting server...")
server.serve_forever()

3. Using an XML-RPC Client

This example demonstrates how to use a client to communicate with an XML-RPC server.

import xmlrpc.client

def add(x, y):
    """Add two numbers."""
    return x + y

# Create an XML-RPC client and connect to the server
client = xmlrpc.client.ServerProxy("http://localhost:8000")

# Call a method on the server
result = client.add(5, 3)
print(f"The result of add is {result}")

# Handle exceptions for RPC calls
try:
    result = client.divide(10, 0)
except xmlrpc.client.Fault as fault:
    print(f"Error from server: {fault.faultString}")

4. Customizing XML-RPC Server Behavior

This example shows how to customize the behavior of an XML-RPC server by adding error handling and logging.

from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    """Add two numbers."""
    return x + y

# Create an XML-RPC server instance
server = SimpleXMLRPCServer(("localhost", 8000))

# Register functions to the server
server.register_function(add, "add")

# Define custom exception handling to log errors
def handle_exception(exc, value, tb):
    print(f"Error: {exc}, {value}")

server.set_exception_handler(handle_exception)

# Start the server and handle exceptions
try:
    server.serve_forever()
except KeyboardInterrupt:
    print("Server shutting down...")

5. Using jsonrpc Module for JSON-RPC Server and Client

The jsonrpc module provides a more modern, feature-rich alternative to XML-RPC.

Server Example with jsonrpc:

from jsonrpcserver import methods, serve

@methods.add
def add(x, y):
    """Add two numbers."""
    return x + y

@methods.add
def subtract(x, y):
    """Subtract two numbers."""
    return x - y

if __name__ == "__main__":
    serve(add)

Client Example with jsonrpc:

import requests

# Define the URL of the JSON-RPC server
url = "http://localhost:8001"

# Function to make a JSON-RPC request
def make_rpc_request(method, params):
    response = requests.post(url, json={"method": method, "params": params, "jsonrpc": "2.0", "id": 1})
    return response.json()

# Call the 'add' method on the server
result = make_rpc_request("add", [5, 3])
print(f"The result of add is {result}")

These examples cover basic and advanced functionalities of the xmlrpc module. Each example includes comments to explain key steps and behaviors. You can adapt these examples to suit your specific needs or integrate them into larger applications.

xmlrpc.client - XMLRPC client access.md

xmlrpc.client - XMLRPC client access

The xmlrpc.client module in Python provides a convenient way to interact with XML-RPC servers. Below are comprehensive examples demonstrating various functionalities of this module:

Example 1: Simple XML-RPC Client

import xmlrpc.client

# Create an XML-RPC client object by specifying the server URL
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Make a method call to the server
result = server.add(5, 3)
print(f"Result of add: {result}")

# Accessing list methods
numbers = [1, 2, 3]
sum_result = server.listSum(numbers)
print(f"Sum of numbers: {sum_result}")

# Handling exceptions
try:
    result = server.subtract(10, "a")
except xmlrpc.client.Fault as fault:
    print(f"Caught XML-RPC Fault: {fault.faultString}")

Example 2: Working with Methods with Arguments

import xmlrpc.client

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Call a method with arguments
result = server.pow(2, 3)
print(f"Result of pow: {result}")

# Method that takes a list as an argument
list_result = server.multiply([10, 20, 30])
print(f"Product of list: {list_result}")

Example 3: Using XML-RPC with HTTPS

import xmlrpc.client

# Create a client object using HTTPS
server = xmlrpc.client.ServerProxy("https://example.com/RPC2")

# Call a method over HTTPS
result = server.add(10, 20)
print(f"Result of add over HTTPS: {result}")

Example 4: Handling Server Responses

import xmlrpc.client

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Call a method that returns multiple values
result = server.echo(1, "hello", [3.14])
print(f"Result of echo: {result}")

Example 5: Using XML-RPC Client with Authentication

import xmlrpc.client

# Create a client object with authentication
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")
credentials = ("username", "password")

# Call a method that requires credentials
result = server.authenticate(credentials, "some_method")
print(f"Result of authenticate: {result}")

Example 6: Using Custom Headers

import xmlrpc.client

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Set custom headers for the request
headers = {"X-Custom-Header": "Value"}
client = server._proxy.__class__.ServerProxy(server.url, **headers)

# Call a method with custom headers
result = client.echo(1, "hello", [3.14])
print(f"Result of echo with custom headers: {result}")

Example 7: Using Callbacks

import xmlrpc.client

def callback(result):
    print(f"Callback received result: {result}")

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Use the call_with_callback method with a callback function
server.add_with_callback(5, 3, callback)

Example 8: Using Binary Data

import xmlrpc.client

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Call a method that accepts binary data
binary_data = b"This is a binary string."
result = server.binary_echo(binary_data)
print(f"Result of binary echo: {result}")

Example 9: Using Threads

import xmlrpc.client
from threading import Thread

def call_method():
    result = client.echo(1, "hello", [3.14])
    print(f"Thread result: {result}")

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")
client = server._proxy.__class__.ServerProxy(server.url)

# Start multiple threads to call the same method concurrently
threads = []
for _ in range(5):
    thread = Thread(target=call_method)
    threads.append(thread)
    thread.start()

# Wait for all threads to complete
for thread in threads:
    thread.join()

Example 10: Handling Large Data

import xmlrpc.client

# Create a client object
server = xmlrpc.client.ServerProxy("http://example.com/RPC2")

# Call a method that accepts large data
large_data = b"x" * 1024 * 1024  # 1MB of data
result = server.large_echo(large_data)
print(f"Result of large echo: {result}")

These examples cover various scenarios and functionalities provided by the xmlrpc.client module, including basic method calls, handling exceptions, using HTTPS, working with multiple arguments, and more.

xmlrpc.server - Basic XMLRPC servers.md

xmlrpc.server - Basic XMLRPC servers

The xmlrpc.server module is part of Python's standard library, providing a simple way to create basic XML-RPC servers. Below are comprehensive examples demonstrating various functionalities within this module, including creating both HTTP and SimpleXMLRPC servers.

Example 1: Creating an HTTP Basic Server

from http.server import BaseHTTPRequestHandler, HTTPServer
import xmlrpc.server

# Define a custom request handler class
class RequestHandler(xmlrpc.server.SimpleHTTPRequestHandler):
    def do_POST(self):
        # Parse the request and extract XML-RPC data
        content_length = int(self.headers['Content-Length'])
        payload = self.rfile.read(content_length)

        # Process the XML-RPC call
        response = handle_xmlrpc_call(payload.decode())

        # Send the response back to the client
        self.send_response(200)
        self.send_header('Content-type', 'text/xml')
        self.end_headers()
        self.wfile.write(response.encode())

def handle_xmlrpc_call(method):
    # This is a placeholder function where you can implement your XML-RPC logic
    if method == "add":
        return xmlrpc.server.dumps([20, 30], methodname="result")
    else:
        return xmlrpc.server.dumps("Unknown method", faultcode=1, faultstring="Method not found")

# Set up the server and port
server_address = ('', 8000)
httpd = HTTPServer(server_address, RequestHandler)

# Start the server
print("Starting XML-RPC Server on port 8000")
httpd.serve_forever()

Explanation:

Example 2: Creating a SimpleXMLRPC Server

import xmlrpc.server

# Define a simple class with XML-RPC methods
class Math:
    def add(self, x, y):
        return x + y

    def subtract(self, x, y):
        return x - y

# Create an instance of the handler class and specify the port
server = xmlrpc.server.SimpleXMLRPCServer(("localhost", 8001))

# Register methods with the server
server.register_instance(Math())

# Print a message indicating that the server is running
print("Starting XML-RPC Server on port 8001")

# Start the server
server.serve_forever()

Explanation:

These examples provide a basic framework for creating XML-RPC servers using Python's standard library. You can expand upon these examples by adding more methods, handling different types of requests, or integrating with other parts of your application.

Microsoft Windows Specific Services

msvcrt - Useful routines from the MS VC++ runtime.md

msvcrt - Useful routines from the MS VC++ runtime

The msvcrt module is a part of the Python Standard Library that provides access to some low-level functions similar to those found in Microsoft's Visual C++ runtime. This module is primarily used for applications that need to interact directly with the operating system, particularly when dealing with console input and output.

Below are comprehensive code examples for each function available in the msvcrt module:

import msvcrt

# Function: getch()
# Description: Waits for a single character from the keyboard.
# Returns: A byte string containing the pressed key.

def example_getch():
    """
    Example of using getch() to read a single character from the console.
    """
    print("Press any key followed by Enter:")
    char = msvcrt.getch()
    print(f"You pressed: {char}")

example_getch()

# Function: kbhit()
# Description: Checks if a keyboard input has been received without blocking.
# Returns: True if a key is available, False otherwise.

def example_kbhit():
    """
    Example of using kbhit() to check for keyboard input before reading it.
    """
    print("Press Enter to continue...")
    while not msvcrt.kbhit():
        pass
    msvcrt.getch()
    print("Key detected!")

example_kbhit()

# Function: putch()
# Description: Sends a single character to the console output buffer.

def example_putch():
    """
    Example of using putch() to write a single character to the console.
    """
    print("Example of using putch() to print a character.")
    msvcrt.putch(b'A')
    print('A has been printed to the console.')

example_putch()

# Function: openfilecon()
# Description: Opens a file connection to the console device.

def example_openfilecon():
    """
    Example of using openfilecon() to open a file handle for the console.
    """
    import os
    print("Opening a file connection to the console...")
    fh = msvcrt.openfilecon('CONOUT$')
    print(f"File handle: {fh}")

example_openfilecon()

# Function: lseek()
# Description: Moves the current position in a file.

def example_lseek():
    """
    Example of using lseek() to move the cursor position in the console.
    """
    import os
    print("Moving the cursor position...")
    fh = msvcrt.openfilecon('CONOUT$')
    offset, whence = 5, 0  # Move by 5 bytes from the start of the file
    new_position = os.lseek(fh.fileno(), offset, whence)
    print(f"Cursor position moved to: {new_position}")

example_lseek()

# Function: getconioerror()
# Description: Retrieves the last error code associated with console input.

def example_getconioerror():
    """
    Example of using getconioerror() to retrieve and display the last error code.
    """
    print("Getting the last error code...")
    err_code = msvcrt.getconioerror()
    print(f"Last error code: {err_code}")

example_getconioerror()

# Function: setmode()
# Description: Sets the mode of a file descriptor to binary or text.

def example_setmode():
    """
    Example of using setmode() to change the mode of the console file handle.
    """
    import os
    print("Changing the mode of the console...")
    fh = msvcrt.openfilecon('CONOUT$')
    # Set the mode to text (default)
    os.setmode(fh.fileno(), os.O_TEXT)
    print(f"Mode set to: {os.getmode(fh.fileno())}")

example_setmode()

# Function: ctrlchandler()
# Description: Sets a handler for Ctrl+C input.

def example_ctrlchandler(handler):
    """
    Example of using ctrlchandler() to set a custom control C handler.
    """
    def my_handler(signum, frame):
        print("Ctrl+C has been detected!")
        return True

    original_handler = msvcrt.ctrlchandler(my_handler)
    try:
        while True:
            pass
    finally:
        # Restore the original handler
        msvcrt.ctrlchandler(original_handler)

example_ctrlchandler(msvcrt.CTRL_C_EVENT)

Explanation:

  1. getch(): This function waits for a single character from the keyboard and returns it as a byte string.

  2. kbhit(): Checks if there is any input waiting to be read from the console without blocking.

  3. putch(): Sends a single character to the console output buffer, which is useful for quick console updates.

  4. openfilecon(): Opens a file connection to the console device using os.open() and returns a file handle.

  5. lseek(): Moves the current position in the console by adjusting the cursor position using os.lseek().

  6. getconioerror(): Retrieves and prints the last error code associated with console input, which can be useful for debugging issues related to reading from the console.

  7. setmode(): Changes the mode of the console file handle to either binary or text using os.setmode(), which is particularly important for handling newline characters in text mode.

  8. ctrlchandler(): Sets a handler function for Ctrl+C input, allowing you to define custom behavior when Ctrl+C is detected.

These examples provide a comprehensive overview of how to use each function in the msvcrt module, covering common console I/O operations and error handling.

winreg - Windows registry access.md

winreg - Windows registry access

The winreg module is part of the Python Standard Library and provides a convenient way to interact with the Windows Registry. This module allows you to read, write, modify, and delete registry keys and values. Below are some comprehensive code examples for various functionalities of the winreg module:

Example 1: Create a New Key in the Current User's Local Machine

import winreg

# Define the path to the new key
key_path = r"SOFTWARE\Example\MyKey"

# Open or create the key with write access
key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, key_path)

# Set a value in the newly created key
winreg.SetValueEx(key, "ValueName", 0, winreg.REG_SZ, "Hello World")

# Close the registry key
winreg.CloseKey(key)

Example 2: Read a Value from a Key

import winreg

# Define the path to the key and the value name
key_path = r"SOFTWARE\Example\MyKey"
value_name = "ValueName"

try:
    # Open the key with read access
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path)

    # Retrieve a value from the key
    value_type, value_data = winreg.QueryValueEx(key, value_name)

    print(f"Value Type: {value_type}")
    print(f"Value Data: {value_data}")

    # Close the registry key
    winreg.CloseKey(key)
except FileNotFoundError:
    print("The specified key or value does not exist.")

Example 3: Delete a Value from a Key

import winreg

# Define the path to the key and the value name
key_path = r"SOFTWARE\Example\MyKey"
value_name = "ValueName"

try:
    # Open the key with write access
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path, 0, winreg.KEY_SET_VALUE)

    # Delete a value from the key
    winreg.DeleteValue(key, value_name)

    print("Value deleted successfully.")

    # Close the registry key
    winreg.CloseKey(key)
except FileNotFoundError:
    print("The specified key or value does not exist.")

Example 4: Modify an Existing Value in a Key

import winreg

# Define the path to the key and the value name
key_path = r"SOFTWARE\Example\MyKey"
value_name = "ValueName"

try:
    # Open the key with write access
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path, 0, winreg.KEY_SET_VALUE)

    # Modify an existing value in the key
    new_value_data = "Updated Value"
    winreg.SetValueEx(key, value_name, 0, winreg.REG_SZ, new_value_data)

    print("Value updated successfully.")

    # Close the registry key
    winreg.CloseKey(key)
except FileNotFoundError:
    print("The specified key or value does not exist.")

Example 5: Create a New Subkey and Set Multiple Values

import winreg

# Define the path to the root key where the subkey will be created
root_key = winreg.HKEY_LOCAL_MACHINE

# Define the full path for the new subkey and its values
subkey_path = r"SOFTWARE\Example\MySubKey"
values_to_set = {
    "StringValue": "Hello, Subkey!",
    "IntegerValue": 123,
    "BinaryValue": b"\x01\x02\x03"
}

# Open or create the subkey with write access
subkey = winreg.CreateKey(root_key, subkey_path)

try:
    # Set multiple values in the newly created subkey
    for value_name, value_data in values_to_set.items():
        if isinstance(value_data, str):
            reg_type = winreg.REG_SZ
        elif isinstance(value_data, int):
            reg_type = winreg.REG_DWORD
        elif isinstance(value_data, bytes):
            reg_type = winreg.REG_BINARY

        winreg.SetValueEx(subkey, value_name, 0, reg_type, value_data)

    print("Values set successfully.")
finally:
    # Close the registry subkey
    winreg.CloseKey(subkey)

Example 6: Read Values from a Subkey

import winreg

# Define the full path to the subkey
subkey_path = r"SOFTWARE\Example\MySubKey"

try:
    # Open the subkey with read access
    subkey = winreg.OpenKey(root_key, subkey_path)

    # Retrieve all values from the subkey
    for value_name in winreg.QueryValueNames(subkey):
        reg_type, value_data = winreg.QueryValueEx(subkey, value_name)

        print(f"Value Name: {value_name}")
        print(f"Value Type: {reg_type}")
        if reg_type == winreg.REG_SZ:
            print(f"Value Data: '{value_data}'")
        elif reg_type == winreg.REG_DWORD:
            print(f"Value Data: {value_data} (Decimal)")
        elif reg_type == winreg.REG_BINARY:
            print(f"Value Data: {value_data.hex()}")

    # Close the registry subkey
    winreg.CloseKey(subkey)
except FileNotFoundError:
    print("The specified key does not exist.")

Example 7: Delete a Subkey and All Its Values

import winreg

# Define the full path to the subkey
subkey_path = r"SOFTWARE\Example\MySubKey"

try:
    # Open the subkey with write access
    subkey = winreg.OpenKey(root_key, subkey_path, 0, winreg.KEY_ALL_ACCESS)

    # Delete all values in the subkey first
    value_names = winreg.QueryValueNames(subkey)
    for value_name in value_names:
        winreg.DeleteValue(subkey, value_name)

    # Delete the subkey
    winreg.DeleteKey(root_key, subkey_path)

    print("Subkey and all its values deleted successfully.")
finally:
    # Close the registry key (not strictly necessary here but good practice)
    if subkey:
        winreg.CloseKey(subkey)

Example 8: Enumerate All Subkeys

import winreg

# Define the path to the root key
root_key = winreg.HKEY_LOCAL_MACHINE

try:
    # Open the root key with read access
    key = winreg.OpenKey(root_key, "")

    # Enumerate all subkeys
    for subkey_name in winreg.EnumKey(key):
        print(subkey_name)

    # Close the registry key
    winreg.CloseKey(key)
except FileNotFoundError:
    print("The specified root key does not exist.")

These examples demonstrate various operations you can perform with the winreg module, including creating and deleting keys, setting and reading values, modifying existing values, handling different value types (string, integer, binary), and enumerating subkeys. Always ensure that you have administrative privileges when making changes to the Windows Registry to avoid errors or system instability.

winsound - Sound-playing interface for Windows.md

winsound - Sound-playing interface for Windows

The winsound module is part of the Windows Sound API (WinMM), which provides an interface to play various types of audio files on Windows systems. It's not a standard library module, but rather a part of the Windows SDK and can be accessed via Python through the ctypes library.

Below are comprehensive examples demonstrating how to use the winsound module to play sounds in Python. These examples will cover basic usage, sound playback control, and error handling.

Example 1: Play a Simple Sound File

import winsound

def play_sound(file_path):
    # Load the sound from the file path
    snd = winsound.mixer.Sound(file_path)

    # Check if the sound was loaded successfully
    if not snd:
        print(f"Error loading sound: {file_path}")
        return

    # Set the volume of the sound (0.0 to 1.0)
    snd.set_volume(0.5)

    # Play the sound
    snd.play()

    # Wait for the sound to finish playing
    while winsound.mixer.get_busy():
        pass

# Example usage
play_sound("path_to_your_sound_file.wav")

Example 2: Play a Sound Using a WAV File

import winsound

def play_wav(file_path):
    # Load the WAV file using the mixer.Sound class
    snd = winsound.mixer.Sound(file_path)

    # Check if the sound was loaded successfully
    if not snd:
        print(f"Error loading sound: {file_path}")
        return

    # Set the volume of the sound (0.0 to 1.0)
    snd.set_volume(0.5)

    # Play the sound
    snd.play()

    # Wait for the sound to finish playing
    while winsound.mixer.get_busy():
        pass

# Example usage
play_wav("path_to_your_sound_file.wav")

Example 3: Stop a Playing Sound

import winsound

def stop_sound(file_path):
    # Load the sound from the file path
    snd = winsound.mixer.Sound(file_path)

    # Check if the sound was loaded successfully
    if not snd:
        print(f"Error loading sound: {file_path}")
        return

    # Stop the playing sound
    snd.stop()

    # Play the sound again to ensure it's in a stopped state
    snd.play()

    # Wait for the sound to finish playing after stop
    while winsound.mixer.get_busy():
        pass

# Example usage
stop_sound("path_to_your_sound_file.wav")

Example 4: Play Multiple Sounds Simultaneously

import winsound
from threading import Thread

def play_sound(file_path):
    # Load the sound from the file path
    snd = winsound.mixer.Sound(file_path)

    # Check if the sound was loaded successfully
    if not snd:
        print(f"Error loading sound: {file_path}")
        return

    # Set the volume of the sound (0.0 to 1.0)
    snd.set_volume(0.5)

    # Play the sound in a separate thread
    Thread(target=snd.play).start()

# Example usage with multiple sounds
play_sound("path_to_your_first_sound_file.wav")
play_sound("path_to_your_second_sound_file.wav")

Example 5: Handle Errors Gracefully

import winsound

def play_safe(file_path):
    try:
        # Load the sound from the file path
        snd = winsound.mixer.Sound(file_path)

        # Check if the sound was loaded successfully
        if not snd:
            raise ValueError(f"Error loading sound: {file_path}")

        # Set the volume of the sound (0.0 to 1.0)
        snd.set_volume(0.5)

        # Play the sound
        snd.play()

        # Wait for the sound to finish playing
        while winsound.mixer.get_busy():
            pass
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
play_safe("path_to_your_sound_file.wav")

Explanation of Each Example

These examples provide a basic framework for using the winsound module to play sounds on Windows systems. Depending on your specific needs, you might want to explore additional functionalities provided by the mixer class in the winsound module, such as looping sounds or handling multiple channels.

Miscellaneous Services

formatter - Generic output formatting.md

formatter - Generic output formatting

The formatter module in Python is not a part of the standard library itself, but rather a part of the locale module, which provides locale-aware functions and classes. This module does not include any generic output formatting functionality. Instead, it is used for handling locale-specific information and number formatting.

However, I can provide an example of how to use the locale module to format numbers in different locales. Here's a comprehensive guide on how you might achieve this:

import locale

def format_number(number, locale_str):
    """
    Formats a given number into a string using the specified locale.

    Parameters:
    - number: The number to be formatted.
    - locale_str: A string representing the locale (e.g., 'en_US.UTF-8', 'fr_FR.UTF-8').

    Returns:
    - A string representation of the number in the specified locale.
    """
    try:
        # Set the locale
        locale.setlocale(locale.LC_ALL, locale_str)

        # Format the number using the current locale
        formatted_number = locale.format_string("%d", number, grouping=True)

        return formatted_number
    except locale.Error as e:
        print(f"Error setting locale: {e}")
        return None

# Example usage
if __name__ == "__main__":
    # List of locales to test
    locales = ['en_US.UTF-8', 'fr_FR.UTF-8', 'de_DE.UTF-8']

    # Number to format
    number_to_format = 1234567

    # Iterate over each locale and print the formatted number
    for locale_str in locales:
        formatted_number = format_number(number_to_format, locale_str)
        if formatted_number is not None:
            print(f"Number {number_to_format} formatted as '{formatted_number}' in {locale_str}.")

Explanation:

  1. Locale Setting: The locale.setlocale() function is used to set the global locale for number formatting. This sets the locale for all categories, including numeric formats.

  2. Formatting Numbers: The locale.format_string() function is used to format numbers according to the current locale settings. The %d directive is used for integers, and grouping=True adds commas as thousands separators.

  3. Error Handling: A try-except block is used to handle any errors that might occur when setting the locale, such as unsupported locales or missing data files.

  4. Example Usage: The script demonstrates how to format the number 1234567 into strings for three different locales: US English, French, and German.

This example provides a basic framework for using the locale module to handle number formatting in different locales, which is often necessary for applications that need to display numbers according to user preferences or specific standards.

Multimedia Services

aifc - Read and write AIFF and AIFC files.md

aifc - Read and write AIFF and AIFC files

The aifc module in Python is used to read and write AIFF (Audio Interchange File Format) and AIFC (AIFF-C, which stands for Audio Interchange File Format with Compression) audio files. These formats are commonly used for digital music files and are widely supported across various platforms.

Below are comprehensive code examples for common tasks related to reading and writing AIFF/AIFC files using the aifc module:

Example 1: Writing an AIFF Audio File

import aifc

def write_aiff_file(filename, frames, sample_rate, channels):
    """
    Write audio data to an AIFF file.

    Parameters:
    - filename (str): The name of the output AIFF file.
    - frames (array-like): The audio data in the form of a sequence of samples.
    - sample_rate (int): The sampling rate of the audio data in Hz.
    - channels (int): The number of channels (1 for mono, 2 for stereo).
    """
    with aifc.open(filename, 'wb') as wavf:
        # Set the parameters
        wavf.setnchannels(channels)
        wavf.setsampwidth(2)  # 16-bit samples
        wavf.setframerate(sample_rate)

        # Write the audio frames to the file
        wavf.writeframes(frames.tobytes())

# Example usage
audio_data = np.array([32768, 0, -32768, 0], dtype=np.int16)  # 4 samples at 16-bit resolution
write_aiff_file('output.aif', audio_data, sample_rate=44100, channels=1)

Example 2: Reading an AIFF Audio File

import aifc
import numpy as np

def read_aiff_file(filename):
    """
    Read audio data from an AIFF file.

    Parameters:
    - filename (str): The name of the input AIFF file.

    Returns:
    - tuple: A tuple containing the audio data, sampling rate, and number of channels.
    """
    with aifc.open(filename, 'rb') as wavf:
        # Read the parameters
        nchannels = wavf.getnchannels()
        sampwidth = wavf.getsampwidth()
        sample_rate = wavf.getframerate()

        # Read all frames and convert to numpy array
        audio_data = np.frombuffer(wavf.readframes(-1), dtype=np.int16)

    return audio_data, sample_rate, nchannels

# Example usage
audio_data, sample_rate, channels = read_aiff_file('input.aif')
print(f"Audio Data: {audio_data}")
print(f"Sample Rate: {sample_rate} Hz")
print(f"Number of Channels: {channels}")

Example 3: Writing an AIFF-C Audio File

AIFF-C is a compressed version of the AIFF format. It uses either the u-law or A-LAW compression schemes for audio data.

import aifc
import numpy as np

def write_aiff_c_file(filename, frames, sample_rate, channels, compression_type='u-law'):
    """
    Write audio data to an AIFF-C file with specified compression type.

    Parameters:
    - filename (str): The name of the output AIFF-C file.
    - frames (array-like): The audio data in the form of a sequence of samples.
    - sample_rate (int): The sampling rate of the audio data in Hz.
    - channels (int): The number of channels (1 for mono, 2 for stereo).
    - compression_type (str): The compression type ('u-law' or 'a-law').
    """
    with aifc.open(filename, 'wb') as wavf:
        # Set the parameters
        wavf.setnchannels(channels)
        wavf.setsampwidth(1)  # 8-bit samples
        wavf.setframerate(sample_rate)

        if compression_type == 'u-law':
            wavf.setcomptype('ULAW')
        elif compression_type == 'a-law':
            wavf.setcomptype('A-LAW')
        else:
            raise ValueError("Unsupported compression type. Use 'u-law' or 'a-law'.")

        # Write the audio frames to the file
        wavf.writeframes(frames.tobytes())

# Example usage
audio_data = np.array([32, 0, -16, 0], dtype=np.int8)  # 4 samples at 8-bit resolution
write_aiff_c_file('output.aifc', audio_data, sample_rate=44100, channels=1, compression_type='u-law')

Example 4: Reading an AIFF-C Audio File

import aifc
import numpy as np

def read_aiff_c_file(filename):
    """
    Read audio data from an AIFF-C file.

    Parameters:
    - filename (str): The name of the input AIFF-C file.

    Returns:
    - tuple: A tuple containing the audio data, sampling rate, and number of channels.
    """
    with aifc.open(filename, 'rb') as wavf:
        # Read the parameters
        nchannels = wavf.getnchannels()
        sampwidth = wavf.getsampwidth()
        sample_rate = wavf.getframerate()

        # Determine compression type
        if wavf.getcomptype() == 'ULAW':
            dtype = np.int8  # u-law samples are stored as 8-bit integers
        elif wavf.getcomptype() == 'A-LAW':
            dtype = np.int8  # a-law samples are stored as 8-bit integers
        else:
            raise ValueError("Unsupported compression type. Use 'u-law' or 'a-law'.")

        # Read all frames and convert to numpy array
        audio_data = np.frombuffer(wavf.readframes(-1), dtype=dtype)

    return audio_data, sample_rate, nchannels

# Example usage
audio_data, sample_rate, channels = read_aiff_c_file('input.aifc')
print(f"Audio Data: {audio_data}")
print(f"Sample Rate: {sample_rate} Hz")
print(f"Number of Channels: {channels}")

Example 5: Handling Different Sample Widths

The aifc module can handle different sample widths, which are specified using the setsampwidth method. This allows you to work with audio data in various bit depths.

import aifc
import numpy as np

def write_custom_aiff_file(filename, frames, sample_rate, channels, sample_width):
    """
    Write audio data to an AIFF file with a specified sample width.

    Parameters:
    - filename (str): The name of the output AIFF file.
    - frames (array-like): The audio data in the form of a sequence of samples.
    - sample_rate (int): The sampling rate of the audio data in Hz.
    - channels (int): The number of channels (1 for mono, 2 for stereo).
    - sample_width (int): The sample width in bytes (e.g., 1 for 8-bit, 2 for 16-bit).
    """
    with aifc.open(filename, 'wb') as wavf:
        # Set the parameters
        wavf.setnchannels(channels)
        wavf.setsampwidth(sample_width)
        wavf.setframerate(sample_rate)

        # Write the audio frames to the file
        wavf.writeframes(frames.tobytes())

# Example usage
audio_data = np.array([32, 0, -16, 0], dtype=np.int8)  # 4 samples at 8-bit resolution
write_custom_aiff_file('output_custom.aif', audio_data, sample_rate=44100, channels=1, sample_width=1)

Example 6: Handling Different Compression Types

AIFF-C supports compression types like U-LAW and A-LAW. These are set using the setcomptype method.

import aifc
import numpy as np

def write_custom_aiff_c_file(filename, frames, sample_rate, channels, compression_type='u-law'):
    """
    Write audio data to an AIFF-C file with a specified compression type.

    Parameters:
    - filename (str): The name of the output AIFF-C file.
    - frames (array-like): The audio data in the form of a sequence of samples.
    - sample_rate (int): The sampling rate of the audio data in Hz.
    - channels (int): The number of channels (1 for mono, 2 for stereo).
    - compression_type (str): The compression type ('u-law' or 'a-law').
    """
    with aifc.open(filename, 'wb') as wavf:
        # Set the parameters
        wavf.setnchannels(channels)
        wavf.setsampwidth(1)  # 8-bit samples
        wavf.setframerate(sample_rate)

        if compression_type == 'u-law':
            wavf.setcomptype('ULAW')
        elif compression_type == 'a-law':
            wavf.setcomptype('A-LAW')
        else:
            raise ValueError("Unsupported compression type. Use 'u-law' or 'a-law'.")

        # Write the audio frames to the file
        wavf.writeframes(frames.tobytes())

# Example usage
audio_data = np.array([32, 0, -16, 0], dtype=np.int8)  # 4 samples at 8-bit resolution
write_custom_aiff_c_file('output_custom.aifc', audio_data, sample_rate=44100, channels=1, compression_type='u-law')

These examples demonstrate how to use the aifc module to create and read AIFF and AIFF-C files with different sample widths, compression types, and formats. The code is designed to be clear and self-contained, allowing you to easily integrate audio handling into your applications.

audioop - Manipulate raw audio data.md

audioop - Manipulate raw audio data

The audioop module in Python provides functions to manipulate raw audio data, such as converting between different sample formats and performing various operations on audio samples. Below are comprehensive examples of how to use these functions, along with explanations for each step.

Example 1: Reading Audio Data from a File

import wave

def read_audio_data(filename):
    """
    Reads audio data from a WAV file and returns the sample rate, number of channels,
    and audio frames as a list of bytes.
    """
    with wave.open(filename, 'rb') as wav_file:
        # Get the parameters (sample rate, number of channels, bits per sample)
        params = wav_file.getparams()

        # Read all the audio data
        audio_frames = wav_file.readframes(params.nframes)

        return params.samplerate, params.nchannels, audio_frames

# Example usage
sample_rate, num_channels, audio_data = read_audio_data('example.wav')
print(f"Sample Rate: {sample_rate} Hz")
print(f"Number of Channels: {num_channels}")

Example 2: Converting Audio Data to Different Formats

import wave
import audioop

def convert_to_int16(audio_frames):
    """
    Converts a sequence of bytes representing audio frames into signed 16-bit integers.
    Assumes the input is in unsigned 8-bit format.
    """
    # Convert to signed 16-bit using audioop.lin2lin()
    converted_audio = audioop.lin2lin(audio_frames, 'U', 'S')
    return converted_audio

# Example usage
sample_rate, num_channels, audio_data = read_audio_data('example.wav')
converted_audio = convert_to_int16(audio_data)

Example 3: Calculating the RMS (Root Mean Square) of Audio Data

import wave
import audioop

def calculate_rms(audio_frames):
    """
    Calculates the root mean square (RMS) of a sequence of bytes representing audio frames.
    Assumes the input is in signed 16-bit format.
    """
    # Calculate RMS using audioop.rms()
    rms = audioop.rms(audio_frames, 2)
    return rms

# Example usage
sample_rate, num_channels, audio_data = read_audio_data('example.wav')
converted_audio = convert_to_int16(audio_data)
rms_value = calculate_rms(converted_audio)
print(f"RMS Value: {rms_value}")

Example 4: Applying a Volume Adjustment to Audio Data

import wave
import audioop

def apply_volume_adjustment(audio_frames, volume_factor):
    """
    Applies a volume adjustment to a sequence of bytes representing audio frames.
    Assumes the input is in signed 16-bit format.
    """
    # Apply volume adjustment using audioop.mul()
    adjusted_audio = audioop.mul(audio_frames, 2, volume_factor)
    return adjusted_audio

# Example usage
sample_rate, num_channels, audio_data = read_audio_data('example.wav')
converted_audio = convert_to_int16(audio_data)
volume_adjusted_audio = apply_volume_adjustment(converted_audio, 0.5)  # Half the original volume

Example 5: Writing Audio Data to a File

import wave

def write_audio_data(filename, sample_rate, num_channels, audio_frames):
    """
    Writes raw audio data to a WAV file.
    """
    with wave.open(filename, 'wb') as wav_file:
        # Write the parameters (sample rate, number of channels, bits per sample)
        wav_file.setnchannels(num_channels)
        wav_file.setsampwidth(2)  # Signed 16-bit
        wav_file.setframerate(sample_rate)

        # Write all the audio data
        wav_file.writeframes(audio_frames)

# Example usage
sample_rate = 44100
num_channels = 2
audio_data = converted_audio  # Use converted data from previous example
write_audio_data('output.wav', sample_rate, num_channels, audio_data)

Explanation

These examples demonstrate how to manipulate audio data using the audioop module in Python. Each function is thoroughly documented to ensure clarity and ease of use in real-world applications.

chunk - Read IFF chunked data.md

chunk - Read IFF chunked data

The chunk module is not a standard library module in Python. It appears to be a fictional or hypothetical module for demonstrating purposes, as there is no actual chunk module available in Python's standard library. However, I can provide examples of how you might work with IFF (Interleaved File Format) data, which is often used for audio and image files.

IFF is a file format that uses chunks to store different types of data within the same file. The chunk module would typically be used to extract or manipulate these chunks from an IFF file.

Here are some example code snippets that demonstrate how you might read and process IFF files in Python:

Example 1: Reading IFF Audio File (using a fictional chunk module)

Assume we have a fictional chunk module that provides functions to interact with IFF files. This is just for demonstration purposes.

import chunk

def read_iff_file(file_path):
    # Open the IFF file in binary mode
    with open(file_path, 'rb') as file:
        # Read the ID of the first chunk
        id = file.read(4)

        while id != b'\0\xff\xff\0':
            # Get the size of the current chunk
            chunk_size = int.from_bytes(file.read(4), byteorder='big')

            # Read the data of the current chunk
            chunk_data = file.read(chunk_size)

            # Process or extract the data as needed

            # Move to the next chunk ID and size
            file.seek(chunk_size + 8, os.SEEK_CUR)

            # Read the ID of the next chunk
            id = file.read(4)

# Example usage
read_iff_file('example.iff')

Example 2: Extracting IFF Image File (using a fictional chunk module)

Again, assume we have a fictional chunk module for handling IFF files.

import chunk

def read_iff_image(file_path):
    # Open the IFF file in binary mode
    with open(file_path, 'rb') as file:
        # Read the ID of the first chunk
        id = file.read(4)

        while id != b'\0\xff\xff\0':
            # Get the size of the current chunk
            chunk_size = int.from_bytes(file.read(4), byteorder='big')

            if id == b'FORM':  # This is a common chunk ID for IFF files
                # Extract and process the FORM chunk
                form_type = file.read(4).decode('ascii')

                print(f"Found FORM: {form_type}")

                # Move to the next chunk ID and size
                file.seek(chunk_size + 8, os.SEEK_CUR)

                # Read the ID of the next chunk
                id = file.read(4)

            elif id == b'DSCS':  # This is a common chunk ID for IFF files
                # Extract and process the DSCS chunk (display specification)
                description_size = int.from_bytes(file.read(4), byteorder='big')

                if description_size > 0:
                    description = file.read(description_size).decode('ascii')
                    print(f"Found DSCS: {description}")

                # Move to the next chunk ID and size
                file.seek(chunk_size + 8, os.SEEK_CUR)

                # Read the ID of the next chunk
                id = file.read(4)

            else:
                # Skip unsupported chunks
                file.seek(chunk_size, os.SEEK_CUR)

            # Continue reading chunks
            id = file.read(4)

# Example usage
read_iff_image('example.iff')

Notes:

  1. Chunk ID: The chunk module would typically have functions to read and write specific chunk IDs (e.g., FORM, DSCS for audio/image files).
  2. Byte Order: The examples assume big-endian byte order, which is common in IFF files.
  3. Error Handling: In a real-world scenario, you would add error handling for cases where chunks are not found or have unexpected sizes.

These examples illustrate how you might interact with IFF files using a fictional chunk module. If there is no actual chunk module available, you would need to implement your own solution or use an existing library that can handle IFF files.

colorsys - Conversions between color systems.md

colorsys - Conversions between color systems

The colorsys module in Python provides a set of functions to convert colors among different models, such as RGB, HSV, CMYK, and more. Below are comprehensive code examples demonstrating various conversions using this module.

import colorsys

# Example 1: Convert from RGB to HSV
def rgb_to_hsv(rgb):
    """
    Converts an RGB tuple (r, g, b) to an HSV tuple (h, s, v).

    Parameters:
    rgb (tuple): A tuple containing three integers representing the red, green, and blue channels of a color.

    Returns:
    tuple: A tuple containing three floats representing the hue (0-1), saturation (0-1), and value (0-1) of the color.
    """
    r, g, b = rgb / 255.0
    h, s, v = colorsys.rgb_to_hsv(r, g, b)
    return h, s, v

# Example 2: Convert from HSV to RGB
def hsv_to_rgb(hsv):
    """
    Converts an HSV tuple (h, s, v) to an RGB tuple (r, g, b).

    Parameters:
    hsv (tuple): A tuple containing three floats representing the hue (0-1), saturation (0-1), and value (0-1) of a color.

    Returns:
    tuple: A tuple containing three integers representing the red, green, and blue channels of the color.
    """
    h, s, v = hsv
    r, g, b = colorsys.hsv_to_rgb(h, s, v)
    return int(r * 255), int(g * 255), int(b * 255)

# Example 3: Convert from RGB to CMYK
def rgb_to_cmyk(rgb):
    """
    Converts an RGB tuple (r, g, b) to a CMYK tuple (c, m, y, k).

    Parameters:
    rgb (tuple): A tuple containing three integers representing the red, green, and blue channels of a color.

    Returns:
    tuple: A tuple containing four floats representing the cyan, magenta, yellow, and key (black) channels of the color.
    """
    r, g, b = rgb / 255.0
    c = 1 - r
    m = 1 - g
    y = 1 - b
    k = min(c, m, y)
    if k == 1:
        return 0, 0, 0, 1
    else:
        c = (c - k) / (1 - k)
        m = (m - k) / (1 - k)
        y = (y - k) / (1 - k)
        return c, m, y, k

# Example 4: Convert from CMYK to RGB
def cmyk_to_rgb(cmyk):
    """
    Converts a CMYK tuple (c, m, y, k) to an RGB tuple (r, g, b).

    Parameters:
    cmyk (tuple): A tuple containing four floats representing the cyan, magenta, yellow, and key (black) channels of a color.

    Returns:
    tuple: A tuple containing three integers representing the red, green, and blue channels of the color.
    """
    c, m, y, k = cmyk
    r = 1 - c * (1 - k)
    g = 1 - m * (1 - k)
    b = 1 - y * (1 - k)
    return int(r * 255), int(g * 255), int(b * 255)

# Example 5: Convert from RGB to HSL
def rgb_to_hsl(rgb):
    """
    Converts an RGB tuple (r, g, b) to an HSL tuple (h, s, l).

    Parameters:
    rgb (tuple): A tuple containing three integers representing the red, green, and blue channels of a color.

    Returns:
    tuple: A tuple containing three floats representing the hue (0-1), saturation (0-1), and lightness (0-1) of the color.
    """
    r, g, b = rgb / 255.0
    h, s, l = colorsys.rgb_to_hls(r, g, b)
    return h, s, l

# Example 6: Convert from HSL to RGB
def hsl_to_rgb(hsl):
    """
    Converts an HSL tuple (h, s, l) to an RGB tuple (r, g, b).

    Parameters:
    hsl (tuple): A tuple containing three floats representing the hue (0-1), saturation (0-1), and lightness (0-1) of a color.

    Returns:
    tuple: A tuple containing three integers representing the red, green, and blue channels of the color.
    """
    h, s, l = hsl
    r, g, b = colorsys.hls_to_rgb(h, s, l)
    return int(r * 255), int(g * 255), int(b * 255)

# Example 7: Convert from RGB to hexadecimal string
def rgb_to_hex(rgb):
    """
    Converts an RGB tuple (r, g, b) to a hexadecimal string.

    Parameters:
    rgb (tuple): A tuple containing three integers representing the red, green, and blue channels of a color.

    Returns:
    str: A string representing the hexadecimal representation of the color.
    """
    r, g, b = rgb
    return "#{:02x}{:02x}{:02x}".format(r, g, b)

# Example 8: Convert from hex to RGB tuple
def hex_to_rgb(hex_color):
    """
    Converts a hexadecimal string to an RGB tuple (r, g, b).

    Parameters:
    hex_color (str): A string representing the hexadecimal color code.

    Returns:
    tuple: A tuple containing three integers representing the red, green, and blue channels of the color.
    """
    hex_color = hex_color.lstrip('#')
    r, g, b = int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16)
    return r, g, b

# Example 9: Convert from RGB to XYZ
def rgb_to_xyz(rgb):
    """
    Converts an RGB tuple (r, g, b) to an XYZ tuple.

    Parameters:
    rgb (tuple): A tuple containing three integers representing the red, green, and blue channels of a color.

    Returns:
    tuple: A tuple containing three floats representing the X, Y, and Z coordinates in the CIE XYZ color space.
    """
    r, g, b = rgb / 255.0
    r = r ** 3 if r > 0.04045 else (r + 0.055) / 1.055
    g = g ** 3 if g > 0.04045 else (g + 0.055) / 1.055
    b = b ** 3 if b > 0.04045 else (b + 0.055) / 1.055
    r *= 129.876
    g *= 129.876
    b *= 129.876
    return 0.4124 * r, 0.3576 * g, 0.1805 * b

# Example 10: Convert from XYZ to RGB
def xyz_to_rgb(xyz):
    """
    Converts an XYZ tuple (x, y, z) to an RGB tuple.

    Parameters:
    xyz (tuple): A tuple containing three floats representing the X, Y, and Z coordinates in the CIE XYZ color space.

    Returns:
    tuple: A tuple containing three integers representing the red, green, and blue channels of the color.
    """
    x, y, z = xyz
    r = 3.2406 * x - 1.5372 * y - 0.4986 * z
    g = -0.9689 * x + 1.8758 * y + 0.0415 * z
    b = 0.0557 * x - 0.2040 * y + 1.0570 * z
    r, g, b = [129.876 / c for c in (r, g, b)]
    r = r ** (1/3) if r > 0.0031308 else r * 1.055 - 0.055
    g = g ** (1/3) if g > 0.0031308 else g * 1.055 - 0.055
    b = b ** (1/3) if b > 0.0031308 else b * 1.055 - 0.055
    return int(round(r * 255)), int(round(g * 255)), int(round(b * 255))

# Example usage:
rgb = (255, 0, 0)
hex_color = rgb_to_hex(rgb)
xyz = rgb_to_xyz(rgb)
print("RGB:", rgb)
print("Hex Color:", hex_color)
print("XYZ Coordinates:", xyz)

# Convert XYZ back to RGB
new_rgb = xyz_to_rgb(xyz)
print("Converted RGB from XYZ:", new_rgb)

This Python script defines functions to convert between various color representations such as RGB, hexadecimal, HSL, CIE XYZ, and more. The conversions are based on standard formulas for each representation. This script also includes example usage of these conversion functions. You can run this script in a Python environment to see the results of the conversions. Keep in mind that some conversions may involve rounding or other adjustments to ensure accurate color representation in different spaces. These scripts are useful for applications requiring precise color manipulation, such as image processing, design software, and web development. Enjoy experimenting with these conversions! "

imghdr - Determine the type of an image.md

imghdr - Determine the type of an image

The imghdr module in Python is used to identify the format of image files by checking their first few bytes. This can be particularly useful when dealing with images where you need to programmatically determine the file type without relying on file extensions.

Below are comprehensive code examples for each functionality available in the imghdr module:

1. identify(filename)

This function takes a filename as input and returns a tuple containing two elements: the image format (if recognized) and an error message if no format is recognized.

import imghdr

def identify_image_format(filename):
    result = imghdr.identify(filename)
    if result:
        format, error = result
        print(f"Image format identified as: {format}")
    else:
        print("No image format found. Error:", error)

# Example usage
identify_image_format('example.jpg')

2. what(buf)

This function takes a bytes-like object containing the first few bytes of an image file and returns the image format if recognized, or None if no format is recognized.

import imghdr

def identify_image_format_from_bytes(buffer):
    result = imghdr.what(buffer)
    if result:
        print(f"Image format identified as: {result}")
    else:
        print("No image format found.")

# Example usage
buffer = b'\xFFD8\xFFE0\x00\x10JFIF\x00'
identify_image_format_from_bytes(buffer)

3. isgif(buf)

This function checks if the provided bytes-like object contains a GIF file.

import imghdr

def is_gif_file(buffer):
    result = imghdr.isgif(buffer)
    print(f"Is the buffer a GIF file? {result}")

# Example usage
buffer = b'\x47\x49\x46\x38\x39'
is_gif_file(buffer)

4. ispng(buf)

This function checks if the provided bytes-like object contains a PNG file.

import imghdr

def is_png_file(buffer):
    result = imghdr.ispng(buffer)
    print(f"Is the buffer a PNG file? {result}")

# Example usage
buffer = b'\x89PNG\r\n\x1a\n'
is_png_file(buffer)

5. issvg(buf)

This function checks if the provided bytes-like object contains an SVG file.

import imghdr

def is_svg_file(buffer):
    result = imghdr.issvg(buffer)
    print(f"Is the buffer an SVG file? {result}")

# Example usage
buffer = b'<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">'
is_svg_file(buffer)

6. istiff(buf)

This function checks if the provided bytes-like object contains a TIFF file.

import imghdr

def is_tiff_file(buffer):
    result = imghdr.istiff(buffer)
    print(f"Is the buffer a TIFF file? {result}")

# Example usage
buffer = b'II\x2a\x00\x16'
is_tiff_file(buffer)

7. iswebp(buf)

This function checks if the provided bytes-like object contains a WebP file.

import imghdr

def is_webp_file(buffer):
    result = imghdr.iswebp(buffer)
    print(f"Is the buffer a WebP file? {result}")

# Example usage
buffer = b'\x52\x49\x46\x50\x2A\x31\x2E\x30'
is_webp_file(buffer)

8. isspc(buf)

This function checks if the provided bytes-like object contains a SPARK file.

import imghdr

def is_spark_file(buffer):
    result = imghdr.isspc(buffer)
    print(f"Is the buffer a SPARK file? {result}")

# Example usage
buffer = b'\x53\x50\x42\x48'
is_spark_file(buffer)

9. iseps(buf)

This function checks if the provided bytes-like object contains an EPS (Encapsulated PostScript) file.

import imghdr

def is_eps_file(buffer):
    result = imghdr.iseps(buffer)
    print(f"Is the buffer an EPS file? {result}")

# Example usage
buffer = b'\x25\x21\x43\x0D\x0A\x0A'
is_eps_file(buffer)

10. isppm(buf)

This function checks if the provided bytes-like object contains a PPM (Portable Pixel Map) file.

import imghdr

def is_ppm_file(buffer):
    result = imghdr.isppm(buffer)
    print(f"Is the buffer a PPM file? {result}")

# Example usage
buffer = b'P3\n20 20\n150\n'
is_ppm_file(buffer)

11. ispbm(buf)

This function checks if the provided bytes-like object contains a PBM (Portable BitMap) file.

import imghdr

def is_pbm_file(buffer):
    result = imghdr.ispbm(buffer)
    print(f"Is the buffer a PBM file? {result}")

# Example usage
buffer = b'P1\n20 20'
is_pbm_file(buffer)

12. ispgm(buf)

This function checks if the provided bytes-like object contains a PGM (Portable GrayMap) file.

import imghdr

def is_pgm_file(buffer):
    result = imghdr.ispgm(buffer)
    print(f"Is the buffer a PGM file? {result}")

# Example usage
buffer = b'P5\n20 20\n150'
is_pgm_file(buffer)

13. isxpm(buf)

This function checks if the provided bytes-like object contains an XPM (X PixMap) file.

import imghdr

def is_xpm_file(buffer):
    result = imghdr.isxpm(buffer)
    print(f"Is the buffer an XPM file? {result}")

# Example usage
buffer = b'/* XPM */
static char *xpm[] = {
    "16 16 2 1",
    "      c none",
    ".     c black",
    "................"
}
is_xpm_file(buffer)

These examples demonstrate how to use each function in the imghdr module to determine the format of image files. Each example includes comments explaining the purpose and usage of the function, making it easy to understand and integrate into larger projects.

ossaudiodev - Access to OSS-compatible audio devices.md

ossaudiodev - Access to OSS-compatible audio devices

The ossaudiodev module in Python provides low-level access to OSS (Open Sound System) compatible audio devices. OSS is a Unix-like sound system that has been used on many Linux distributions, as well as other systems like FreeBSD and Solaris.

Below are comprehensive code examples for the ossaudiodev module, covering various functionalities such as opening a device, setting parameters, playing and recording audio, and closing the device:

import ossaudiodev

# Example 1: Open an OSS audio device for output (e.g., ALSA)
def open_audio_output():
    """
    Opens an OSS audio device for output.

    Returns:
        file-like object: A file-like object that can be used to write audio data.
    """
    try:
        # Open a file in binary mode
        out_device = ossaudiodev.open('w', -1)

        # Set the number of channels (e.g., 2 for stereo)
        out_device.setchannels(2)

        # Set the sample rate (e.g., 44100 Hz)
        out_device.setrate(44100)

        # Set the format (e.g., 8-bit mono, 16-bit stereo)
        out_device.setformat(ossaudiodev.AFMT_S16_LE)  # or AFMT_U8 for 8-bit

        return out_device
    except Exception as e:
        print(f"Error opening audio output device: {e}")
        return None

# Example 2: Open an OSS audio device for input (e.g., ALSA)
def open_audio_input():
    """
    Opens an OSS audio device for input.

    Returns:
        file-like object: A file-like object that can be used to read audio data.
    """
    try:
        # Open a file in binary mode
        in_device = ossaudiodev.open('r', -1)

        # Set the number of channels (e.g., 2 for stereo)
        in_device.setchannels(2)

        # Set the sample rate (e.g., 44100 Hz)
        in_device.setrate(44100)

        # Set the format (e.g., 8-bit mono, 16-bit stereo)
        in_device.setformat(ossaudiodev.AFMT_S16_LE)  # or AFMT_U8 for 8-bit

        return in_device
    except Exception as e:
        print(f"Error opening audio input device: {e}")
        return None

# Example 3: Play an audio file using open_audio_output
def play_audio_file(filename, out_device):
    """
    Plays an audio file using the provided output device.

    Args:
        filename (str): The path to the audio file.
        out_device (file-like object): An OSS audio device opened for output.
    """
    try:
        with open(filename, 'rb') as infile:
            data = infile.read()
            while data:
                out_device.write(data)
                data = infile.read()
        print("Audio playback complete.")
    except Exception as e:
        print(f"Error playing audio file: {e}")

# Example 4: Record an audio file using open_audio_input
def record_audio_file(filename, in_device):
    """
    Records an audio file from the provided input device.

    Args:
        filename (str): The path to save the recorded audio file.
        in_device (file-like object): An OSS audio device opened for input.
    """
    try:
        with open(filename, 'wb') as outfile:
            while True:
                data = in_device.read(1024)
                if not data:
                    break
                outfile.write(data)
        print("Audio recording complete.")
    except Exception as e:
        print(f"Error recording audio file: {e}")

# Example 5: Close the OSS audio devices
def close_audio_devices(out_device, in_device):
    """
    Closes the provided OSS audio devices.

    Args:
        out_device (file-like object): The output device to close.
        in_device (file-like object): The input device to close.
    """
    try:
        if out_device:
            out_device.close()
        if in_device:
            in_device.close()
        print("Audio devices closed.")
    except Exception as e:
        print(f"Error closing audio devices: {e}")

# Example usage
if __name__ == "__main__":
    # Open an output device for playback
    out_device = open_audio_output()

    # Play a sample audio file
    play_audio_file('path_to_sample.wav', out_device)

    # Close the output device
    close_audio_devices(out_device, None)

    # Optionally, open an input device and record an audio file
    in_device = open_audio_input()
    if in_device:
        record_audio_file('recorded_audio.wav', in_device)
        close_audio_devices(None, in_device)

Key Points:

  1. Device Open: The open function is used to open a device for either output or input. It takes two arguments: the mode ('w' for write, 'r' for read) and an index (usually -1 for default).

  2. Parameters: Functions like setchannels, setrate, and setformat are used to set the number of channels, sample rate, and audio format respectively.

  3. File-like Operations: The device is treated as a file object, allowing you to write or read data using standard I/O operations (write and read).

  4. Error Handling: Basic error handling is included to catch and print exceptions that may occur during device opening or operations.

  5. Closing Devices: Always close the devices after use to free up resources and ensure proper cleanup.

These examples provide a comprehensive introduction to using the ossaudiodev module for audio processing tasks in Python.

sndhdr - Determine type of sound file.md

sndhdr - Determine type of sound file

The sndhdr module in Python is used to determine the type of a sound file based on its header information. It provides functions to read and parse the headers of various audio formats and return their corresponding names.

Here are comprehensive code examples for using the sndhdr module:

import sndhdr

def determine_sound_type(file_path):
    """
    Determine the type of a sound file using the sndhdr module.

    Args:
    file_path (str): The path to the audio file.

    Returns:
    str: The name of the sound format, or None if the file is not recognized.
    """
    # Use sndhdr.what() function to determine the type of the sound file
    result = sndhdr.what(file_path)

    # Check if the file was successfully identified
    if result is None:
        return None

    # Return the name of the sound format
    return result[0]

# Example usage
file_path = 'example.wav'
sound_format = determine_sound_type(file_path)

if sound_format:
    print(f"The sound file '{file_path}' is of type: {sound_format}")
else:
    print(f"The sound file '{file_path}' is not recognized.")

Explanation:

  1. Import the sndhdr module: This module provides the necessary functions to work with sound file headers.

  2. Function Definition: The determine_sound_type function takes a file path as input and returns the name of the audio format if recognized, or None otherwise.

  3. Using sndhdr.what(): This function reads the header of the specified audio file and attempts to identify its format. It returns a tuple containing the format name and some additional information about the file (e.g., the number of channels and sample rate).

  4. Error Handling: If sndhdr.what() returns None, it means the file was not recognized, and the function returns None.

  5. Example Usage: The example demonstrates how to use the determine_sound_type function to identify a sound file named 'example.wav'. It prints the result or indicates if the file is not recognized.

This code is suitable for inclusion in official documentation as it provides a straightforward and clear demonstration of how to use the sndhdr module to determine the format of audio files.

sunau - Read and write Sun AU files.md

sunau - Read and write Sun AU files

Below is a comprehensive set of code examples for the sunau module, which allows reading and writing Sun AU (Audio AUdio) files in Python. Each example includes comments to explain each step.

# Importing the necessary module
import sunau
import wave

def read_sunau_file(file_path):
    """
    Reads a Sun AU file and returns a SoundFile object.

    Parameters:
    - file_path (str): The path to the Sun AU file.

    Returns:
    - soundfile: A SoundFile object containing the audio data.
    """
    # Open the Sun AU file in read mode
    with sunau.open(file_path, 'r') as audio_file:
        # Read all frames from the file
        frames = audio_file.readframes(-1)

        # Create a SoundFile object using the read frames and sample rate
        soundfile = wave.Wave_read(audio_file.framerate, frames)

    return soundfile

def write_sunau_file(file_path, frames, samplerate):
    """
    Writes audio frames to a Sun AU file.

    Parameters:
    - file_path (str): The path where the Sun AU file will be saved.
    - frames: An iterable of audio frames.
    - samplerate (int): The sample rate of the audio data.
    """
    # Open the Sun AU file in write mode
    with sunau.open(file_path, 'w') as audio_file:
        # Write all frames to the file
        audio_file.writeframes(frames)

    print(f"Audio written to {file_path}")

# Example usage

if __name__ == "__main__":
    # Read a Sun AU file
    read_sunau_example = read_sunau_file('example.au')
    print(read_sunau_example.get_params())

    # Write audio frames to a Sun AU file
    write_sunau_example = b'...'  # This should be the actual bytes of your audio data
    write_sunau_file('output.au', write_sunau_example, 44100)

Explanation:

  1. Reading a Sun AU File:
  2. The read_sunau_file function opens a Sun AU file in read mode.
  3. It reads all frames from the file using the readframes method of the sunau object.
  4. A wave.Wave_read object is created using the sample rate and frames read.

  5. Writing a Sun AU File:

  6. The write_sunau_file function opens a Sun AU file in write mode.
  7. It writes all frames to the file using the writeframes method of the sunau object.

  8. Example Usage:

  9. The example usage demonstrates how to read and write a Sun AU file using the functions defined above.
  10. The actual audio data should be provided as bytes in the write_sunau_file function.

This code provides a basic framework for working with Sun AU files, including reading and writing them. You can extend these examples by adding error handling, more complex audio processing, or additional features as needed.

wave - Read and write WAV files.md

wave - Read and write WAV files

The wave module in Python provides a way to read from and write WAV files, which are a widely used format for storing audio data. Below are comprehensive examples demonstrating how to use various functionalities of the wave module. These examples include reading and writing basic audio files, handling stereo files, using different sample formats, and dealing with compression.

Example 1: Reading and Writing Basic WAV Files

import wave

# Function to read a WAV file
def read_wav(file_path):
    # Open the WAV file in read mode
    wav_file = wave.open(file_path, 'rb')

    # Read the WAV header information
    nchannels, sampwidth, framerate, nframes, comptype, compname = wav_file.getparams()

    # Read the audio data as bytes
    audio_data = wav_file.readframes(nframes)

    # Close the file
    wav_file.close()

    return nchannels, sampwidth, framerate, nframes, audio_data

# Function to write a WAV file
def write_wav(file_path, nchannels, sampwidth, framerate, nframes, audio_data):
    # Open the WAV file in write mode
    with wave.open(file_path, 'wb') as wav_file:
        # Write the WAV header information
        wav_file.setnchannels(nchannels)
        wav_file.setsampwidth(sampwidth)
        wav_file.setframerate(framerate)
        wav_file.writeframes(audio_data)

# Example usage
input_file = 'input.wav'
output_file = 'output.wav'

# Read the input WAV file
nchannels, sampwidth, framerate, nframes, audio_data = read_wav(input_file)

# Write the output WAV file with same parameters
write_wav(output_file, nchannels, sampwidth, framerate, nframes, audio_data)

print(f"Read and written {output_file}")

Example 2: Reading and Writing Stereo WAV Files

import wave

def read_wav(file_path):
    wav_file = wave.open(file_path, 'rb')
    nchannels, sampwidth, framerate, nframes, comptype, compname = wav_file.getparams()
    audio_data = wav_file.readframes(nframes)
    wav_file.close()
    return nchannels, sampwidth, framerate, nframes, audio_data

def write_wav(file_path, nchannels, sampwidth, framerate, nframes, audio_data):
    with wave.open(file_path, 'wb') as wav_file:
        wav_file.setnchannels(nchannels)
        wav_file.setsampwidth(sampwidth)
        wav_file.setframerate(framerate)
        wav_file.writeframes(audio_data)

# Example usage for stereo WAV file
input_stereo_file = 'input_stereo.wav'
output_stereo_file = 'output_stereo.wav'

# Read the input stereo WAV file
nchannels, sampwidth, framerate, nframes, audio_data = read_wav(input_stereo_file)

# Write the output stereo WAV file with same parameters
write_wav(output_stereo_file, nchannels, sampwidth, framerate, nframes, audio_data)

print(f"Read and written {output_stereo_file}")

Example 3: Reading and Writing Files in Different Sample Formats

import wave

def read_wav(file_path):
    wav_file = wave.open(file_path, 'rb')
    nchannels, sampwidth, framerate, nframes, comptype, compname = wav_file.getparams()
    audio_data = wav_file.readframes(nframes)
    wav_file.close()
    return nchannels, sampwidth, framerate, nframes, audio_data

def write_wav(file_path, nchannels, sampwidth, framerate, nframes, audio_data):
    with wave.open(file_path, 'wb') as wav_file:
        wav_file.setnchannels(nchannels)
        wav_file.setsampwidth(sampwidth)
        wav_file.setframerate(framerate)
        wav_file.writeframes(audio_data)

# Example usage for different sample formats (16-bit and 8-bit)
input_16bit_file = 'input_16bit.wav'
output_16bit_file = 'output_16bit.wav'

input_8bit_file = 'input_8bit.wav'
output_8bit_file = 'output_8bit.wav'

# Read the input 16-bit WAV file
nchannels, sampwidth_16bit, framerate, nframes_16bit, audio_data_16bit = read_wav(input_16bit_file)

# Write the output 16-bit WAV file with same parameters
write_wav(output_16bit_file, nchannels, sampwidth_16bit, framerate, nframes_16bit, audio_data_16bit)

print(f"Read and written {output_16bit_file}")

# Read the input 8-bit WAV file
nchannels, sampwidth_8bit, framerate, nframes_8bit, audio_data_8bit = read_wav(input_8bit_file)

# Write the output 8-bit WAV file with same parameters
write_wav(output_8bit_file, nchannels, sampwidth_8bit, framerate, nframes_8bit, audio_data_8bit)

print(f"Read and written {output_8bit_file}")

Example 4: Handling Compression in WAV Files

import wave

def read_wav(file_path):
    wav_file = wave.open(file_path, 'rb')
    nchannels, sampwidth, framerate, nframes, comptype, compname = wav_file.getparams()
    audio_data = wav_file.readframes(nframes)
    wav_file.close()
    return nchannels, sampwidth, framerate, nframes, audio_data

def write_wav(file_path, nchannels, sampwidth, framerate, nframes, audio_data):
    with wave.open(file_path, 'wb') as wav_file:
        wav_file.setnchannels(nchannels)
        wav_file.setsampwidth(sampwidth)
        wav_file.setframerate(framerate)
        wav_file.writeframes(audio_data)

# Example usage for compressed WAV file (e.g., using Compressed PCM)
input_compressed_file = 'compressed_input.wav'
output_compressed_file = 'compressed_output.wav'

# Read the input compressed WAV file
nchannels, sampwidth, framerate, nframes, comptype, compname = read_wav(input_compressed_file)

# Write the output compressed WAV file with same parameters
write_wav(output_compressed_file, nchannels, sampwidth, framerate, nframes, audio_data)

print(f"Read and written {output_compressed_file}")

These examples demonstrate basic operations for reading and writing WAV files using the wave module. You can extend these examples to handle more complex scenarios, such as multi-channel audio or different sample rates.

Networking and Interprocess Communication

asyncio - Asynchronous I O.md

asyncio - Asynchronous I/O

Below are comprehensive and well-documented code examples for various functionalities provided by the asyncio module in Python 3.12. Each example is designed to be clear, concise, and follows best practices for inclusion in official documentation.

Example 1: Basic Asynchronous Function with a Delay

This example demonstrates how to define an asynchronous function that uses await to sleep for a specified amount of time.

import asyncio

async def print_after(delay, message):
    await asyncio.sleep(delay)
    print(message)

# Running the coroutine
asyncio.run(print_after(2, "Hello after 2 seconds"))

Example 2: Using Asyncio Tasks

This example shows how to use asyncio.create_task to schedule multiple asynchronous tasks.

import asyncio

async def task1():
    await asyncio.sleep(1)
    print("Task 1 completed")

async def task2():
    await asyncio.sleep(2)
    print("Task 2 completed")

async def main():
    await asyncio.gather(task1(), task2())

# Running the tasks
asyncio.run(main())

Example 3: Handling Exceptions in Asynchronous Functions

This example demonstrates how to handle exceptions within an asynchronous function.

import asyncio

async def failing_task():
    await asyncio.sleep(1)
    raise ValueError("An error occurred")

async def main():
    try:
        await failing_task()
    except Exception as e:
        print(f"Caught exception: {e}")

# Running the coroutine
asyncio.run(main())

Example 4: Using Event Loops

This example illustrates how to manually create and manage an event loop.

import asyncio

async def run_until_complete():
    await asyncio.sleep(1)
    print("Loop completed")

loop = asyncio.get_event_loop()
loop.create_task(run_until_complete())
loop.run_forever()

# To stop the loop, you would typically use loop.stop() and call loop.close(), but here we assume it runs indefinitely

Example 5: Asynchronous I/O with asyncio.open_file

This example shows how to perform asynchronous file I/O using asyncio.open_file.

import asyncio

async def read_file(file_path):
    try:
        async with open(file_path, 'r') as file:
            content = await file.read()
        return content
    except FileNotFoundError:
        return f"File {file_path} not found."

# Running the coroutine
file_content = asyncio.run(read_file('example.txt'))
print(file_content)

Example 6: Asynchronous I/O with aiohttp for Web Requests

This example demonstrates how to use aiohttp in conjunction with asyncio to make asynchronous HTTP requests.

First, ensure you have aiohttp installed:

pip install aiohttp

Then, here's the code example:

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)

# Running the coroutine
asyncio.run(main())

Example 7: Asynchronous I/O with asyncpg for Database Operations

This example demonstrates how to use asyncpg in conjunction with asyncio to perform asynchronous database operations.

First, ensure you have asyncpg installed:

pip install asyncpg

Then, here's the code example:

import asyncio
import asyncpg

async def fetch_data(connection):
    query = 'SELECT * FROM my_table'
    result = await connection.fetch(query)
    return result

async def main():
    conn_str = 'postgresql://user:password@localhost/my_database'
    retries = 5
    for attempt in range(retries):
        try:
            pool = await asyncpg.create_pool(conn_str)
            break
        except (OSError, asyncpg.exceptions.ConnectionDoesNotExistError) as e:
            print(f"Attempt {attempt + 1} failed: {e}")
            if attempt < retries - 1:
                await asyncio.sleep(2)
            else:
                print("Failed to connect to the database after several attempts.")
                return

    try:
        data = await fetch_data(pool)
        for row in data:
            print(row)
    finally:
        await pool.close()

# Running the coroutine
asyncio.run(main())

Example 8: Asynchronous I/O with psycopg2 for Database Operations

This example demonstrates how to use psycopg2 in conjunction with asyncio to perform asynchronous database operations.

First, ensure you have psycopg2 installed:

pip install psycopg2-binary

Then, here's the code example:

import asyncio
import asyncpg
import asyncio

async def fetch_data(conn):
    query = 'SELECT * FROM my_table'
    result = await conn.fetch(query)
    return result

async def main():
    conn_str = 'postgresql://username:password@127.0.0.1/my_database'
    conn = await asyncpg.connect(conn_str)
    data = await fetch_data(conn)
    for row in data:
        print(row)
    await conn.close()

# Running the coroutine
asyncio.run(main())

Example 9: Asynchronous I/O with gevent for Non-blocking HTTP Requests

This example demonstrates how to use gevent along with aiohttp to perform asynchronous HTTP requests.

First, ensure you have gevent and aiohttp installed:

pip install gevent aiohttp

Then, here's the code example:

import asyncpg
import asyncio

async def fetch_data(conn):
    query = 'SELECT * FROM my_table'
    result = await conn.fetch(query)
    return result

async def main():
    conn_str = 'postgresql://username:password@127.0.0.1/my_database'
    try:
        conn = await asyncpg.connect(conn_str)
        data = await fetch_data(conn)
        for row in data:
            print(row)
        await conn.close()
    except (asyncpg.PostgresError, OSError) as e:
        print(f"Error connecting to the database: {e}")

# Running the coroutine
asyncio.run(main())

Example 10: Asynchronous I/O with gevent for Non-blocking Database Operations

This example demonstrates how to use gevent along with psycopg2 to perform asynchronous database operations.

First, ensure you have gevent and psycopg2-binary installed:

pip install gevent psycopg2-binary

Then, here's the code example:

import gevent
from gevent import monkey
monkey.patch_all()
import psycopg2
from psycopg2 import extras

def fetch_data(conn):
    cursor = conn.cursor(cursor_factory=extras.RealDictCursor)
    query = 'SELECT * FROM my_table'
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    return result

def main():
    conn_str = 'dbname=my_database user=username password=password host=localhost'
    conn = psycopg2.connect(conn_str)
    data = fetch_data(conn)
    for row in data:
        print(row)
    conn.close()

if __name__ == "__main__":
    try:
        # Running the coroutine
        gevent.spawn(main).join()
    except KeyboardInterrupt:
        print("Process interrupted by user")

These examples cover a range of asynchronous I/O functionalities available in Python's asyncio module, including basic tasks, handling exceptions, managing event loops, performing file I/O, making HTTP requests, and interacting with databases using different libraries. Each example is designed to be clear and self-contained, providing a starting point for developers looking to learn about asynchronous programming in Python.

mmap - Memory-mapped file support.md

mmap - Memory-mapped file support

The mmap module in Python allows you to memory-map files, which means that it creates a view of a file as if it were an array of bytes in memory. This can be useful for working with large files efficiently without loading the entire file into memory at once.

Here are some code examples demonstrating various functionalities of the mmap module:

Example 1: Basic Memory Mapping

import mmap
import os

# Path to a sample file
file_path = 'example.txt'

# Create or open the file in binary mode for reading and writing
with open(file_path, 'r+b') as f:
    # Create a memory-mapped file object
    mm = mmap.mmap(f.fileno(), 0)

    # Write some data to the memory-mapped area
    mm.write(b'Hello, world!')

    # Move the cursor to the beginning of the mapped region
    mm.seek(0)

    # Read the data from the memory-mapped area
    print(mm.read().decode('utf-8'))

    # Close the memory mapping
    mm.close()

Example 2: Synchronization with File

import mmap
import os

# Path to a sample file
file_path = 'example.txt'

# Create or open the file in binary mode for reading and writing
with open(file_path, 'r+b') as f:
    # Create a memory-mapped file object
    mm = mmap.mmap(f.fileno(), 0)

    # Write some data to the memory-mapped area
    mm.write(b'Hello, synchronization!')

    # Sync the memory-mapped area with the file's contents
    mm.flush()

    # Seek back to the beginning of the mapped region
    mm.seek(0)

    # Read the data from the memory-mapped area
    print(mm.read().decode('utf-8'))

    # Close the memory mapping
    mm.close()

Example 3: Writing and Reading Large Files

import mmap
import os

# Path to a large sample file
file_path = 'large_file.txt'

# Create or open the file in binary mode for reading and writing
with open(file_path, 'r+b') as f:
    # Create a memory-mapped file object
    mm = mmap.mmap(f.fileno(), 0)

    # Write some large data to the memory-mapped area
    mm.write(b'Large data repeated many times')

    # Sync the memory-mapped area with the file's contents
    mm.flush()

    # Seek back to the beginning of the mapped region
    mm.seek(0)

    # Read the entire content of the memory-mapped area
    large_data = mm.read()

    # Close the memory mapping
    mm.close()

Example 4: Memory-Mapping Multiple Regions

import mmap
import os

# Path to a sample file
file_path = 'example.txt'

# Create or open the file in binary mode for reading and writing
with open(file_path, 'r+b') as f:
    # Create a memory-mapped file object
    mm = mmap.mmap(f.fileno(), 0)

    # Write some data to the first region
    mm.write(b'First region: Hello, ')

    # Seek back to the beginning of the mapped region
    mm.seek(0)

    # Read and print the first region
    print(mm.read(13).decode('utf-8'))

    # Seek to the second position in the file
    f.seek(14)

    # Create a new memory-mapped object for the remaining data
    mm2 = mmap.mmap(f.fileno(), os.path.getsize(file_path) - 14, offset=14)

    # Read and print the second region
    print(mm2.read().decode('utf-8'))

    # Close both memory mappings
    mm.close()
    mm2.close()

Example 5: Using Memory-Mapped Files with Multiple Processes

import mmap
import os
import multiprocessing

def process_data(data):
    with open('data.txt', 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        mm.write(data)
        mm.flush()
        mm.seek(0)
        print(mm.read().decode('utf-8'))
        mm.close()

# Data to be processed
data_to_process = b'Process data example'

# Create a process and pass the data to it
process = multiprocessing.Process(target=process_data, args=(data_to_process,))
process.start()
process.join()

These examples demonstrate how to use the mmap module for various operations such as writing to, reading from, and synchronizing memory-mapped files. Each example includes comments explaining the steps involved.

select - Waiting for I O completion.md

select - Waiting for I/O completion

The select module in Python is used to monitor multiple file descriptors (like sockets, pipes, etc.) for read or write operations, allowing an application to wait until one or more of them are ready for I/O. This is particularly useful in network programming where you need to handle multiple connections simultaneously.

Here's a comprehensive guide and examples for using the select module in Python:

1. Basic Usage

Example: Monitoring Multiple Sockets for Read Operations

import select
import socket

def monitor_sockets(sockets):
    # Create a list of read-ready sockets
    readable, _, _ = select.select(sockets, [], [])

    for sock in readable:
        data = sock.recv(1024)
        if not data:
            print(f"Connection closed by {sock.getpeername()}")
            sock.close()
        else:
            print(f"Received data from {sock.getpeername()}: {data.decode()}")

if __name__ == "__main__":
    # Create a list of sockets to monitor
    sockets = [
        socket.socket(socket.AF_INET, socket.SOCK_STREAM),
        socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ]

    for sock in sockets:
        sock.setblocking(False)  # Set non-blocking mode
        sock.connect_ex(('localhost', 12345))  # Connect to a server

    while True:
        monitor_sockets(sockets)

2. Handling Write Operations

Example: Monitoring Multiple Sockets for Write Operations

import select
import socket
import threading

def write_to_socket(sock, data):
    sock.sendall(data.encode())
    print(f"Sent {data} to {sock.getpeername()}")

def monitor_sockets(sockets):
    # Create a list of write-ready sockets and their associated data
    writable, _, _ = select.select([], sockets, [])

    for sock in writable:
        data = f"Message from {threading.current_thread().name}"
        write_to_socket(sock, data)

if __name__ == "__main__":
    # Create a list of sockets to monitor
    sockets = [
        socket.socket(socket.AF_INET, socket.SOCK_STREAM),
        socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ]

    for sock in sockets:
        sock.setblocking(False)  # Set non-blocking mode
        sock.connect_ex(('localhost', 12345))  # Connect to a server

    # Start a thread to send data to each socket periodically
    threads = []
    for i, sock in enumerate(sockets):
        t = threading.Thread(target=write_to_socket, args=(sock, f"Thread {i}"))
        threads.append(t)
        t.start()

    while True:
        monitor_sockets(sockets)

3. Monitoring Multiple File Descriptors

Example: Using select with Files and Sockets

import select
import socket
import time

def read_from_file(file, timeout=5):
    print(f"Reading from {file.name}")
    try:
        data = file.read(1024)
        if not data:
            print("File is closed")
        else:
            print(f"Read: {data.decode()}")
    except Exception as e:
        print(f"Error reading from file: {e}")

def monitor_file(file, sockets):
    readable, _, _ = select.select([file], [], [])

    if file in readable:
        read_from_file(file)

if __name__ == "__main__":
    # Create a socket and connect to it
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect_ex(('localhost', 12345))

    # Open a file for reading
    with open('example.txt', 'r') as file:
        while True:
            monitor_file(file, [sock])
            time.sleep(1)

4. Monitoring Multiple File Descriptors with Non-blocking I/O

Example: Using select with Pipes and Sockets in Non-blocking Mode

import select
import os
import socket
import threading

def read_from_pipe(pipe):
    try:
        data = os.read(pipe, 1024)
        if not data:
            print("Pipe closed")
        else:
            print(f"Read: {data.decode()}")
    except Exception as e:
        print(f"Error reading from pipe: {e}")

def monitor_pipes(pipes, sockets):
    readable, _, _ = select.select([], pipes, [])

    for pipe in readable:
        read_from_pipe(pipe)

if __name__ == "__main__":
    # Create a socket and connect to it
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect_ex(('localhost', 12345))

    # Create pipes for communication between threads
    pipe_read, pipe_write = os.pipe()

    def write_to_pipe(pipe):
        try:
            data = b"Message from thread"
            os.write(pipe, data)
        except Exception as e:
            print(f"Error writing to pipe: {e}")

    # Start a thread to write to the pipe
    t = threading.Thread(target=write_to_pipe, args=(pipe_write,))
    t.start()

    while True:
        monitor_pipes([pipe_read], [sock])

5. Using select with Timeout

Example: Monitoring Sockets with a Timeout

import select
import socket
import time

def read_from_socket(sock, timeout=10):
    try:
        data = sock.recv(1024)
        if not data:
            print("Connection closed")
        else:
            print(f"Received data: {data.decode()}")
    except Exception as e:
        print(f"Error reading from socket: {e}")

def monitor_sockets(sockets, timeout):
    # Create a list of read-ready sockets
    readable, _, _ = select.select(sockets, [], [], timeout)

    for sock in readable:
        read_from_socket(sock)

if __name__ == "__main__":
    # Create a list of sockets to monitor
    sockets = [
        socket.socket(socket.AF_INET, socket.SOCK_STREAM),
        socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ]

    for sock in sockets:
        sock.setblocking(False)  # Set non-blocking mode
        sock.connect_ex(('localhost', 12345))  # Connect to a server

    while True:
        monitor_sockets(sockets, 10)

Conclusion

The select module is a powerful tool for I/O multiplexing in Python. It allows you to efficiently manage multiple file descriptors, which is particularly useful in scenarios where your application needs to handle multiple connections or other resources concurrently. The examples provided demonstrate how to use select with sockets, files, and pipes, along with handling non-blocking I/O and timeouts.

selectors - High-level I O multiplexing.md

selectors - High-level I/O multiplexing

Below is a comprehensive set of code examples demonstrating various functionalities of the selectors module in Python 3.12, along with comments explaining each step.

1. Basic Usage

import selectors

# Create a selector instance
sel = selectors.DefaultSelector()

def accept(sock, mask):
    # Accept a new connection
    conn, addr = sock.accept()
    print(f'Accepted {addr}')

    # Register the connection with the selector
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    # Read data from the connection
    data = conn.recv(1024)
    if data:
        print('Received', repr(data))
        conn.sendall(data)  # Echo back to client
    else:
        print('Closing connection')
        sel.unregister(conn)
        conn.close()

def main():
    # Create a TCP/IP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind the socket to the address and port
    server_socket.bind(('localhost', 12345))

    # Enable reuse of the socket address
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Listen for incoming connections
    server_socket.listen(10)
    print('Server listening on port 12345')

    # Register the server socket with the selector
    sel.register(server_socket, selectors.EVENT_READ, accept)

    while True:
        # Wait for an event to occur on one of the registered file descriptors
        events = sel.select(timeout=None)

        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)

if __name__ == '__main__':
    main()

2. Using EventLoop and Selector

import selectors

class EchoServer:
    def __init__(self):
        self.sel = selectors.DefaultSelector()

    def run(self, host='localhost', port=12345):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # Bind the socket to the address and port
        server_socket.bind((host, port))

        # Enable reuse of the socket address
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        # Listen for incoming connections
        server_socket.listen(10)
        print(f'Server listening on {host}:{port}')

        # Register the server socket with the selector
        self.sel.register(server_socket, selectors.EVENT_READ, self.accept)

    def accept(self, sock, mask):
        # Accept a new connection
        conn, addr = sock.accept()
        print(f'Accepted {addr}')

        # Register the connection with the selector
        self.sel.register(conn, selectors.EVENT_READ | selectors.EVENT_WRITE, self.read_write)

    def read_write(self, conn, mask):
        if mask & selectors.EVENT_READ:
            # Read data from the connection
            data = conn.recv(1024)
            if data:
                print('Received', repr(data))
                conn.sendall(data)  # Echo back to client
            else:
                print('Closing connection')
                self.sel.unregister(conn)
                conn.close()

    def main(self):
        import asyncio

        loop = asyncio.get_event_loop()
        server_task = loop.run_until_complete(
            self.sel.serve_forever(host='localhost', port=12345)
        )

if __name__ == '__main__':
    EchoServer().run()

3. Handling Multiple Sockets and Events

import selectors
import socket

def handle_socket(server_socket, mask):
    if mask & selectors.EVENT_READ:
        # Accept a new connection
        conn, addr = server_socket.accept()
        print(f'Accepted {addr}')

        # Register the connection with the selector
        sel.register(conn, selectors.EVENT_READ | selectors.EVENT_WRITE, read_write)

def read_write(conn, mask):
    if mask & selectors.EVENT_READ:
        # Read data from the connection
        data = conn.recv(1024)
        if data:
            print('Received', repr(data))
            conn.sendall(data)  # Echo back to client
        else:
            print('Closing connection')
            sel.unregister(conn)
            conn.close()
    elif mask & selectors.EVENT_WRITE:
        # Write some data to the connection
        conn.send(b'Hello, client!')

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind the socket to the address and port
    server_socket.bind(('localhost', 12345))

    # Enable reuse of the socket address
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Listen for incoming connections
    server_socket.listen(10)
    print(f'Server listening on port 12345')

    sel = selectors.DefaultSelector()

    # Register the server socket with the selector
    sel.register(server_socket, selectors.EVENT_READ, handle_socket)

    while True:
        # Wait for an event to occur on one of the registered file descriptors
        events = sel.select(timeout=None)

        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)

if __name__ == '__main__':
    main()

4. Using Selector with Non-Blocking Sockets

import selectors
import socket

def handle_socket(sock, mask):
    if mask & selectors.EVENT_READ:
        # Read data from the connection
        data = sock.recv(1024)
        if data:
            print('Received', repr(data))
            sock.sendall(data)  # Echo back to client
        else:
            print('Closing connection')
            sel.unregister(sock)
            sock.close()

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind the socket to the address and port
    server_socket.bind(('localhost', 12345))

    # Enable reuse of the socket address
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Listen for incoming connections
    server_socket.listen(10)
    print(f'Server listening on port 12345')

    sel = selectors.DefaultSelector()

    # Register the server socket with the selector
    sel.register(server_socket, selectors.EVENT_READ, handle_socket)

    while True:
        # Wait for an event to occur on one of the registered file descriptors
        events = sel.select(timeout=None)

        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)

if __name__ == '__main__':
    main()

5. Using Selector with Timed Events

import selectors
import socket
import time

def handle_socket(sock, mask):
    if mask & selectors.EVENT_READ:
        # Read data from the connection
        data = sock.recv(1024)
        if data:
            print('Received', repr(data))
            sock.sendall(data)  # Echo back to client
        else:
            print('Closing connection')
            sel.unregister(sock)
            sock.close()

def check_timeouts(events):
    for key, mask in events:
        callback = key.data
        try:
            callback()
        except Exception as e:
            print(f'Error from {key.fileobj}: {e}')
            sel.unregister(key.fileobj)

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind the socket to the address and port
    server_socket.bind(('localhost', 12345))

    # Enable reuse of the socket address
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Listen for incoming connections
    server_socket.listen(10)
    print(f'Server listening on port 12345')

    sel = selectors.DefaultSelector()

    # Register the server socket with the selector
    sel.register(server_socket, selectors.EVENT_READ, handle_socket)

    while True:
        # Wait for an event to occur on one of the registered file descriptors
        events = sel.select(timeout=1)

        # Check if any timed out callbacks need to be executed
        check_timeouts(events)

if __name__ == '__main__':
    main()

6. Using Selector with Priority Queues

import selectors
import socket

def handle_socket(sock, mask):
    if mask & selectors.EVENT_READ:
        # Read data from the connection
        data = sock.recv(1024)
        if data:
            print('Received', repr(data))
            sock.sendall(data)  # Echo back to client
        else:
            print('Closing connection')
            sel.unregister(sock)
            sock.close()

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind the socket to the address and port
    server_socket.bind(('localhost', 12345))

    # Enable reuse of the socket address
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Listen for incoming connections
    server_socket.listen(10)
    print(f'Server listening on port 12345')

    sel = selectors.DefaultSelector()

    # Register the server socket with the selector
    sel.register(server_socket, selectors.EVENT_READ, handle_socket)

    while True:
        # Wait for an event to occur on one of the registered file descriptors
        events = sel.select(timeout=None)

        # Process events in order of priority (if needed)
        for key, mask in events:
            callback = key.data
            try:
                callback()
            except Exception as e:
                print(f'Error from {key.fileobj}: {e}')
                sel.unregister(key.fileobj)

if __name__ == '__main__':
    main()

These examples demonstrate various use cases for the selectors module in Python, including handling multiple connections with different types of events (read, write, etc.), using timed events, and prioritizing event processing. Each example is designed to illustrate a specific feature or scenario within the selectors API.

signal - Set handlers for asynchronous events.md

signal - Set handlers for asynchronous events

The signal module in Python provides a way to handle signals raised by the operating system, such as SIGINT (CTRL+C) or SIGHUP (hangup). These signals can be used to interrupt running processes, request termination, or perform cleanup actions before exiting.

Here are comprehensive examples of how to use the signal module:

Example 1: Handling SIGINT (Ctrl+C)

import signal

def handle_sigint(signum, frame):
    print("Received SIGINT (CTRL+C), cleaning up...")
    # Perform any necessary cleanup operations here
    # For example, closing file handles, releasing resources, etc.

# Register the handler for SIGINT
signal.signal(signal.SIGINT, handle_sigint)

print("Press Ctrl+C to send a SIGINT signal.")
input()  # This will block until the user presses CTRL+C

Example 2: Handling SIGHUP

import signal

def handle_sighup(signum, frame):
    print("Received SIGHUP (hangup), performing graceful termination...")
    # Perform any necessary shutdown or cleanup operations here
    # For example, saving data to a file, releasing connections, etc.

# Register the handler for SIGHUP
signal.signal(signal.SIGHUP, handle_sighup)

print("This program will continue running until you terminate it manually.")
input()  # This will block until the user terminates the program

Example 3: Sending Signals to a Process

You can send signals to another process using the os.kill() function from the os module. Here's an example:

import os
import signal

# Function to simulate a simple server that listens for SIGINT and prints messages
def server_process():
    while True:
        try:
            print("Server is running...")
            # Simulate some work
            import time
            time.sleep(2)
        except KeyboardInterrupt:
            print("Server received SIGINT, stopping gracefully.")
            break

# Start the server process in a separate thread or process
import threading
server_thread = threading.Thread(target=server_process)
server_thread.start()

# Function to send SIGINT to the server process
def send_sigint_to_server():
    try:
        # Find the process ID of the server thread
        server_pid = os.getpid(server_thread.ident)

        # Send SIGINT to the server process
        print(f"Sending SIGINT to PID {server_pid}")
        os.kill(server_pid, signal.SIGINT)
    except OSError as e:
        print(f"Error sending SIGINT: {e}")

# Simulate a user pressing CTRL+C on the server
send_sigint_to_server()

# Wait for the server process to finish
server_thread.join()

Example 4: Handling Signals in a Multi-Threaded Application

In a multi-threaded application, you can handle signals differently depending on whether they should be propagated to all threads or only to the main thread.

import signal
import threading

def handler(signum, frame):
    print(f"Received signal {signum}, handling it in the main thread.")

# Register the handler for SIGINT
signal.signal(signal.SIGINT, handler)

def worker_thread():
    try:
        while True:
            print("Worker thread is running...")
            # Simulate some work
            import time
            time.sleep(1)
    except KeyboardInterrupt:
        print("Worker thread received SIGINT, stopping gracefully.")

# Create and start the worker thread
worker_thread = threading.Thread(target=worker_thread)
worker_thread.start()

input()  # This will block until the user presses CTRL+C

print("Main thread is handling the signal.")

Example 5: Handling Signals with a Custom Signal Class

You can create a custom class to manage signal handlers more elegantly:

class SignalManager:
    def __init__(self):
        self.handlers = {}

    def register(self, signum, handler):
        if isinstance(signum, int) and callable(handler):
            self.handlers[signum] = handler
            signal.signal(signum, self._handler)
        else:
            raise ValueError("Signum must be an integer and handler must be a callable function.")

    def _handler(self, signum, frame):
        if signum in self.handlers:
            self.handlers[signum](signum, frame)

# Example usage
signal_manager = SignalManager()
def custom_handler(signum, frame):
    print(f"Custom handler for signal {signum}")

signal_manager.register(signal.SIGINT, custom_handler)
print("Press Ctrl+C to send a SIGINT signal.")
input()  # This will block until the user presses CTRL+C

These examples demonstrate various ways to handle signals in Python using the signal module. Each example includes comments explaining key parts of the code, ensuring clarity and ease of understanding for developers.

socket - Low-level networking interface.md

socket - Low-level networking interface

The socket module in Python provides a low-level interface for network communication. It allows you to create sockets and use them to connect to other servers, send and receive data over various protocols such as TCP and UDP. Below are comprehensive code examples demonstrating various functionalities of the socket module.

1. Creating a TCP Socket

import socket

# Create a new TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to an address and port
server_address = ('localhost', 10000)
print(f'Starting up on {server_address[0]} port {server_address[1]}')
server_socket.bind(server_address)

# Listen for incoming connections
server_socket.listen()
print('Waiting for a connection...')

# Accept a connection
connection, client_address = server_socket.accept()
try:
    print(f'Connection from {client_address}')

    # Receive data in small chunks and echo it back to the client
    while True:
        data = connection.recv(16)
        if data:
            print(f"Received: '{data.decode()}'")
            connection.sendall(data)  # Echo the received data
        else:
            print('No more data from', client_address)
            break

finally:
    # Clean up the connection
    connection.close()

Explanation:

2. Creating a UDP Socket

import socket

# Create a new UDP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Define the server address and port
server_address = ('localhost', 10000)
print(f'Sending to {server_address[0]} port {server_address[1]}')

# Message to send
message = b'Hello from UDP client'

try:
    # Send data
    print('Sending message: "%s"' % message)
    client_socket.sendto(message, server_address)

    # Receive a response from the server (assuming it echoes back)
    received_data, server_address = client_socket.recvfrom(4096)
    print(f'Received "{received_data.decode()}" from {server_address}')

finally:
    # Close the socket
    client_socket.close()

Explanation:

3. Connecting to a Remote Server

import socket

# Create a new TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Define the server address and port
server_address = ('example.com', 80)

try:
    # Connect to the server
    print('Connecting to %s port %d' % server_address)
    client_socket.connect(server_address)

    # Send data
    message = b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n"
    print("Sending message:", message.decode())
    client_socket.sendall(message)

    # Receive the response from the server
    amount_received = 0
    amount_expected = len(message)

    while True:
        data = client_socket.recv(16)
        if not data:
            break
        amount_received += len(data)
        print(f"Received {amount_received} bytes of data")

    print('Received', amount_received, 'bytes from', server_address)

finally:
    # Close the socket
    client_socket.close()

Explanation:

4. Using Sockets with Multithreading

import socket
import threading

def handle_client(client_socket, client_address):
    print('Handling client', client_address)

    try:
        while True:
            data = client_socket.recv(16)
            if not data:
                break
            print(f"Received: '{data.decode()}' from {client_address}")
            client_socket.sendall(data)  # Echo the received data

    finally:
        # Close the connection
        client_socket.close()
        print('Closed connection with', client_address)

# Create a TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to an address and port
server_address = ('localhost', 10000)
print(f'Starting up on {server_address[0]} port {server_address[1]}')
server_socket.bind(server_address)

# Listen for incoming connections
server_socket.listen()

try:
    while True:
        print('Waiting for a connection...')
        client_socket, client_address = server_socket.accept()

        # Handle the new connection in a separate thread
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_thread.start()

except KeyboardInterrupt:
    print('Server shutting down.')

finally:
    # Clean up the listening socket
    server_socket.close()

Explanation:

These examples cover basic functionalities of the socket module, including creating sockets, binding and listening, connecting to remote servers, and handling multiple connections with threading.

ssl - TLS SSL wrapper for socket objects.md

ssl - TLS/SSL wrapper for socket objects

The ssl module in Python provides a way to create secure network connections using SSL/TLS protocols. It allows you to wrap existing socket objects with an encrypted layer, making it suitable for applications that require secure communication.

Below are some comprehensive code examples demonstrating various functionalities of the ssl module:

1. Creating an SSL Context

import ssl
import socket

# Create a context object using the default settings
context = ssl.create_default_context()

# Alternatively, create a context with specific options
# context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# context.verify_mode = ssl.CERT_REQUIRED
# context.load_verify_locations('path/to/certificates')

# Wrap an existing socket object with the SSL context
with socket.create_connection(('example.com', 443)) as sock:
    with context.wrap_socket(sock, server_hostname='example.com') as ssock:
        print("SSL connection established successfully!")

2. Server-Side SSL Configuration

import ssl
import socket

# Create a secure socket object for the server
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind to an address and port
server_socket.bind(('localhost', 443))

# Set the socket to listen for incoming connections
server_socket.listen(5)

# Create an SSL context with specific options
context = ssl.create_default_context()
context.load_cert_chain('path/to/cert.pem', 'path/to/key.pem')

# Accept a connection and wrap it with SSL
client_socket, addr = server_socket.accept()
with context.wrap_socket(client_socket, server_side=True) as ssock:
    print("SSL handshake completed:", ssock.version)

3. Client-Side Verification of Server Certificate

import ssl
import socket

# Create a context object with certificate verification enabled
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('path/to/certificates')

# Wrap an existing socket object with the SSL context
with socket.create_connection(('example.com', 443)) as sock:
    with context.wrap_socket(sock, server_hostname='example.com') as ssock:
        print("SSL connection established successfully!")

4. Using a Custom Certificate Store

import ssl
import socket

# Create a custom certificate store for the context
context = ssl.create_default_context()
context.load_verify_locations('path/to/custom/certs')

# Wrap an existing socket object with the SSL context
with socket.create_connection(('example.com', 443)) as sock:
    with context.wrap_socket(sock, server_hostname='example.com') as ssock:
        print("SSL connection established successfully!")

5. Handling SSL Errors

import ssl
import socket

# Create a context object using default settings
context = ssl.create_default_context()

try:
    # Wrap an existing socket object with the SSL context
    with socket.create_connection(('example.com', 443)) as sock:
        with context.wrap_socket(sock, server_hostname='example.com') as ssock:
            print("SSL connection established successfully!")
except ssl.SSLError as e:
    print(f"An SSL error occurred: {e}")

6. Using a Specific SSL Protocol

import ssl
import socket

# Create a context object for a specific SSL protocol version
context = ssl.create_default_context(ssl.PROTOCOL_TLSv1_2)

# Wrap an existing socket object with the SSL context
with socket.create_connection(('example.com', 443)) as sock:
    with context.wrap_socket(sock, server_hostname='example.com') as ssock:
        print(f"SSL connection using TLSv1.2 established successfully!")

7. Server-Side Handling of Client Authentication

import ssl
import socket

# Create a secure socket object for the server
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind to an address and port
server_socket.bind(('localhost', 443))

# Set the socket to listen for incoming connections
server_socket.listen(5)

# Create an SSL context with client authentication enabled
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain('path/to/cert.pem', 'path/to/key.pem')
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('path/to/certificates')

# Accept a connection and wrap it with SSL
client_socket, addr = server_socket.accept()
with context.wrap_socket(client_socket, server_side=True) as ssock:
    print("SSL handshake completed:", ssock.version)
    # Check if the client provided a valid certificate
    try:
        peer_cert = ssock.getpeercert()
        print("Client's certificate:", peer_cert)
    except ssl.SSLError:
        print("The client did not provide a valid certificate.")

8. Using SSL/TLS with SOCKS Proxy

import ssl
import socket
import socks

# Set up a SOCKS proxy (e.g., using PySocks)
socks.set_default_proxy(socks.SOCKS5, 'proxy_host', 1080)

# Create a context object for the default protocol
context = ssl.create_default_context()

# Wrap an existing socket object with the SSL context
with socket.create_connection(('example.com', 443)) as sock:
    with socks.socksocket(socket.AF_INET, socket.SOCK_STREAM) as ssock:
        ssock.connect((socks.DEFAULT_PROXY_HOST, socks.DEFAULT_PROXY_PORT))
        with context.wrap_socket(ssock) as ssl_sock:
            print("SSL connection through SOCKS proxy established successfully!")

These examples cover a range of use cases for the ssl module, from basic server and client configurations to handling errors and using specific SSL protocols. Each example includes comments to help understand each step and is designed to be included in official documentation or tutorials.

Numeric and Mathematical Modules

cmath - Mathematical functions for complex numbers.md

cmath - Mathematical functions for complex numbers

Below is a comprehensive set of example code snippets demonstrating various functionalities available in the cmath module, which provides mathematical functions for complex numbers in Python 3.12.

import cmath

# Example 1: Basic Complex Number Operations
# Create a complex number using the constructor
z = complex(3, 4)
print(f"Complex number z: {z}")

# Convert real and imaginary parts separately
real_part = z.real
imaginary_part = z.imag
print(f"Real part: {real_part}, Imaginary part: {imaginary_part}")

# Add two complex numbers
w = complex(1, 2)
result_addition = z + w
print(f"Addition of z and w: {result_addition}")

# Subtract one complex number from another
result_subtraction = z - w
print(f"Subtraction of w from z: {result_subtraction}")

# Multiply two complex numbers
result_multiplication = z * w
print(f"Multiplication of z and w: {result_multiplication}")

# Divide one complex number by another
result_division = z / w
print(f"Division of z by w: {result_division}")

# Example 2: Absolute Value and Phase of a Complex Number
abs_z = abs(z)
phase_z = cmath.phase(z)
print(f"Absolute value of z: {abs_z}, Phase (angle in radians): {phase_z}")

# Example 3: Polar and Rectangular Representation
polar_representation = cmath.polar(z)
rectangular_representation = cmath.rect(abs_z, phase_z)
print(f"Polar representation (r, theta): {polar_representation}")
print(f"Rectangular representation (x, y): {rectangular_representation}")

# Example 4: Square Root of a Complex Number
sqrt_z = cmath.sqrt(z)
print(f"Square root of z: {sqrt_z}")

# Example 5: Exponential and Logarithmic Functions for Complex Numbers
exp_z = cmath.exp(z)
log_z = cmath.log(z)
print(f"Exponent of z: {exp_z}")
print(f"Natural logarithm of z: {log_z}")

# Example 6: Trigonometric and Hyperbolic Functions for Complex Numbers
sin_z = cmath.sin(z)
cos_z = cmath.cos(z)
tan_z = cmath.tan(z)

asinh_z = cmath.asinh(z)
acosh_z = cmath.acosh(z)
atanh_z = cmath.atanh(z)

print(f"Trigonometric functions: sin({z})={sin_z}, cos({z})={cos_z}, tan({z})={tan_z}")
print(f"Inverse hyperbolic trigonometric functions: asinh({z})={asinh_z}, acosh({z})={acosh_z}, atanh({z})={atanh_z}")

# Example 7: Roots of a Quadratic Equation
a = 1
b = -3
c = 2

roots = cmath.sqrt(b**2 - 4*a*c)
root1 = (-b + roots) / (2 * a)
root2 = (-b - roots) / (2 * a)

print(f"Roots of the quadratic equation ax^2 + bx + c = 0: {root1}, {root2}")

# Example 8: Roots of Unity
n = 5  # Number of roots
roots_of_unity = [cmath.exp(2j * cmath.pi * k / n) for k in range(n)]
print(f"Roots of unity (for n={n}): {roots_of_unity}")

# Example 9: Complex Conjugate
conjugate_z = z.conjugate()
print(f"Conjugate of z: {conjugate_z}")

# Example 10: Check if a complex number is real or imaginary
if conjugate_z == z:
    print("z is a real number")
elif z.imag != 0:
    print("z is an imaginary number")
else:
    print("z is zero")

# Example 11: Check if a complex number is purely imaginary
if z.real == 0:
    print("z is purely imaginary")
else:
    print("z is not purely imaginary")

# Example 12: Complex Number Exponentiation with Euler's Formula
euler_formula_result = cmath.exp(z)
print(f"Exponential of z using Euler's formula: {euler_formula_result}")

Explanation:

These examples cover a range of operations and properties available in the cmath module, providing comprehensive understanding of its functionalities.

decimal - Decimal fixed-point and floating-point arithmetic.md

decimal - Decimal fixed-point and floating-point arithmetic

The decimal module in Python provides support for fast correctly-rounded decimal floating point arithmetic. It offers classes for manipulating numbers with arbitrary precision, which is useful for financial calculations where accuracy to many decimal places is critical.

Here are comprehensive code examples for various functionalities of the decimal module:

1. Basic Usage

First, import the Decimal class from the decimal module.

from decimal import Decimal

# Create a Decimal object with a specific precision
d = Decimal('3.14')
print(d)  # Output: 3.14

2. Precision and Rounding

The decimal module supports setting a global precision for all operations.

from decimal import Decimal, getcontext

# Set the global precision to 5 decimal places
getcontext().prec = 5

d = Decimal('0.1') + Decimal('0.2')
print(d)  # Output: 0.30000

3. Rounding Modes

You can specify rounding modes using the ROUND_HALF_UP, ROUND_DOWN, etc., constants.

from decimal import Decimal, ROUND_HALF_UP

d = Decimal('5.6789')
rounded_d = d.quantize(Decimal('1.0'), rounding=ROUND_HALF_UP)
print(rounded_d)  # Output: 5.7

4. Arithmetic Operations

Perform basic arithmetic operations using Decimal.

from decimal import Decimal

a = Decimal('3.14')
b = Decimal('2.718')

addition = a + b
subtraction = a - b
multiplication = a * b
division = a / b  # Floating-point division

print(addition)    # Output: 5.862
print(subtraction)   # Output: 0.422
print(multiplication)# Output: 8.53912
print(division)      # Output: 1.1747599469077755

5. Comparisons

Use the comparison operators to compare Decimal objects.

from decimal import Decimal

a = Decimal('3.14')
b = Decimal('2.718')

print(a == b)    # Output: False
print(a > b)     # Output: True
print(a < b)     # Output: False

6. Formatting

Convert Decimal objects to strings with specific formatting.

from decimal import Decimal, ROUND_HALF_UP

d = Decimal('1234567890.12345')

# Format with two decimal places and round half up
formatted_d = d.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(formatted_d)  # Output: '1234567890.12'

7. Conversions

Convert Decimal objects to other numeric types.

from decimal import Decimal

d = Decimal('42')
float_d = float(d)
int_d = int(d)

print(float_d)   # Output: 42.0
print(int_d)     # Output: 42

8. Context Management

Use LocalContext for temporary changes in precision or rounding.

from decimal import Decimal, getcontext, LocalContext

getcontext().prec = 3

with LocalContext(prec=5):
    d = Decimal('1.0')
    print(d)  # Output: 1.00000

print(getcontext().prec)  # Output: 3

9. Arithmetic with Strings and Integers

You can also perform arithmetic operations directly with strings or integers.

from decimal import Decimal

a = Decimal('3.14')
b = '2.718'

addition_str = a + b
print(addition_str)  # Output: '5.862'

10. Special Values

Handle special values like infinity and NaN.

from decimal import Decimal, DecimalInfinity, DecimalNaN

a = Decimal('inf')
b = Decimal('-inf')

print(a + b)     # Output: inf
print(DecimalNaN)    # Output: NaN

These examples cover the basic functionalities of the decimal module in Python. The decimal module is essential for applications requiring precise arithmetic, such as financial calculations and scientific computing.

fractions - Rational numbers.md

fractions - Rational numbers

The fractions module in Python provides support for rational number arithmetic. Here are comprehensive and well-documented code examples that cover various functionalities within this module:

import fractions

# Creating Rational Numbers

# Using constructor
num1 = fractions.Fraction(3, 4)  # Represents the fraction 3/4
num2 = fractions.Fraction(5, 6)  # Represents the fraction 5/6

print(num1)        # Output: 3/4
print(num2)        # Output: 5/6

# From integers
num3 = fractions.Fraction(7)   # Equivalent to Fraction(7, 1)
print(num3)        # Output: 7/1

# Using string input
num4 = fractions.Fraction('3/4')  # Represents the fraction 3/4
print(num4)        # Output: 3/4

# Converting a float to a Fraction
num5 = fractions.Fraction(0.75)
print(num5)        # Output: 3/4

# Using mixed numbers
mixed_num = fractions.Fraction(3, 2)  # Represents the fraction 3/2
print(mixed_num)     # Output: 3/2

# Arithmetic Operations

# Addition
result_add = num1 + num2
print(result_add)   # Output: 17/12

# Subtraction
result_subtract = num1 - num2
print(result_subtract) # Output: -1/12

# Multiplication
result_multiply = num1 * num2
print(result_multiply) # Output: 5/24

# Division
result_divide = num1 / num2
print(result_divide)   # Output: 3/10

# Exponentiation
result_power = num1 ** 2
print(result_power)    # Output: 9/16

# Comparison Operators

# Equality
if num1 == num3:
    print("num1 is equal to num3")
else:
    print("num1 is not equal to num3")

# Inequality
if num1 != num4:
    print("num1 is not equal to num4")
else:
    print("num1 is equal to num4")

# Less than
if num1 < num2:
    print("num1 is less than num2")
else:
    print("num1 is not less than num2")

# Greater than
if num1 > num3:
    print("num1 is greater than num3")
else:
    print("num1 is not greater than num3")

# Less than or equal to
if num1 <= num2:
    print("num1 is less than or equal to num2")
else:
    print("num1 is not less than or equal to num2")

# Greater than or equal to
if num1 >= num4:
    print("num1 is greater than or equal to num4")
else:
    print("num1 is not greater than or equal to num4")

# Converting to float and int

float_num = float(num5)
print(float_num)      # Output: 0.75

int_num = int(num3)
print(int_num)       # Output: 7

# Absolute value
abs_value = abs(fractions.Fraction(-2, 3))
print(abs_value)     # Output: 2/3

# Converting to string
str_num = str(num1)
print(str_num)      # Output: '3/4'

# Fraction representation in decimal format
decimal_repr = num1.limit_denominator()
print(decimal_repr)   # Output: 0.75

# Numerator and Denominator
numerator = fractions.Fraction(8, 6).numerator
denominator = fractions.Fraction(8, 6).denominator
print(numerator)    # Output: 4
print(denominator)   # Output: 3

# Simplifying a fraction
simplified_num = fractions.Fraction(10, 25)
simplified_num = simplified_num.limit_denominator()
print(simplified_num)   # Output: 2/5

# Operations with Infinite Fractions
inf_frac = float('inf')  # Represents Infinity
zero_frac = fractions.Fraction(0)  # Represents Zero

print(inf_frac + inf_frac)      # Output: Infinity
print(zero_frac - inf_frac)    # Output: -Infinity

Explanation:

  1. Creating Rational Numbers: The Fraction class is used to create rational numbers from integers, floats, strings, or mixed number representations.

  2. Arithmetic Operations: Basic arithmetic operations like addition, subtraction, multiplication, and division are supported, along with exponentiation.

  3. Comparison Operators: Functions like ==, !=, <, >, <=, and >= are used to compare fractions.

  4. Conversions:

  5. To float: Use the float() function.
  6. To integer: Use the int() function.
  7. To string: Use the str() function.

  8. Absolute Value: The abs() function returns the absolute value of a fraction.

  9. Fraction Representation in Decimal Format: The limit_denominator() method is used to simplify the fraction and convert it to a float, which represents the decimal equivalent.

  10. Numerator and Denominator: Use the numerator and denominator attributes to access these properties of a fraction.

  11. Simplifying Fractions: Use the limit_denominator() method to reduce fractions to their simplest form.

  12. Operations with Infinite Fractions: Special representations like 'Infinity' and 'Zero' are supported for operations involving infinite or zero values.

These examples provide a comprehensive overview of how to use the fractions module in Python, covering various aspects of rational number arithmetic.

math - Mathematical functions.md

math - Mathematical functions

The math module is a fundamental part of Python's standard library, providing a wide range of mathematical functions and constants. Below are comprehensive code examples for each functionality within the math module. These examples are designed to be clear, concise, and suitable for inclusion in official documentation.

1. Trigonometric Functions

import math

# Calculate the sine of an angle (in radians)
angle = math.pi / 4
sine_value = math.sin(angle)
print(f"Sine of {angle} radians: {sine_value}")

# Calculate the cosine of an angle (in radians)
cosine_value = math.cos(angle)
print(f"Cosine of {angle} radians: {cosine_value}")

# Calculate the tangent of an angle (in radians)
tangent_value = math.tan(angle)
print(f"Tangent of {angle} radians: {tangent_value}")

2. Logarithmic Functions

import math

# Calculate the natural logarithm of a number
x = 10
natural_log = math.log(x)
print(f"Natural logarithm of {x}: {natural_log}")

# Calculate the base-10 logarithm of a number
base_10_log = math.log10(x)
print(f"Base-10 logarithm of {x}: {base_10_log}")

3. Exponential and Power Functions

import math

# Calculate e raised to the power of x
e_x = math.exp(1)  # This is equivalent to math.e ** x
print(f"e^1: {e_x}")

# Raise a number to the power of another number
base = 2
exponent = 3
result = base ** exponent
print(f"{base} raised to the power of {exponent}: {result}")

4. Square Root and Floor/Ceiling Functions

import math

# Calculate the square root of a number
number = 16
sqrt_value = math.sqrt(number)
print(f"Square root of {number}: {sqrt_value}")

# Calculate the floor of a number (rounds down to the nearest integer)
x = 4.7
floor_value = math.floor(x)
print(f"Floor of {x}: {floor_value}")

# Calculate the ceiling of a number (rounds up to the nearest integer)
y = 4.2
ceiling_value = math.ceil(y)
print(f"Ceiling of {y}: {ceiling_value}")

5. Constants

import math

# Access mathematical constants
pi = math.pi
e = math.e
inf = math.inf
nan = math.nan

print(f"Value of ฯ€: {pi}")
print(f"Value of e: {e}")
print(f"Infinity: {inf}")
print(f"Not a Number (NaN): {nan}")

6. Rounding Functions

import math

# Round a number to the nearest integer
x = 4.75
rounded_value = round(x)
print(f"Rounded value of {x}: {rounded_value}")

# Round a number up to the nearest even integer (bankers' rounding)
y = 3.5
round_up_even = math.floor(y + 0.5) if y % 1 == 0.5 else math.ceil(y - 0.5)
print(f"Rounded up to nearest even integer of {y}: {round_up_even}")

7. Factorial and Gamma Function

import math

# Calculate the factorial of a number
factorial_5 = math.factorial(5)
print(f"Factorial of 5: {factorial_5}")

# Calculate the gamma function (which is related to factorials for positive integers)
gamma_3 = math.gamma(3)
print(f"Gamma function of 3: {gamma_3}")

8. Modular Arithmetic Functions

import math

# Calculate the greatest common divisor using Euclid's algorithm
a, b = 48, 18
gcd_value = math.gcd(a, b)
print(f"GCD of {a} and {b}: {gcd_value}")

# Calculate the least common multiple (LCM) using the formula LCM(x, y) = |x * y| / GCD(x, y)
lcm_value = abs(a * b) // math.gcd(a, b)
print(f"LCM of {a} and {b}: {lcm_value}")

9. Hyperbolic Functions

import math

# Calculate the hyperbolic sine of an angle (in radians)
hyperbolic_sine = math.sinh(1)
print(f"Hyperbolic sine of 1 radian: {hyperbolic_sine}")

# Calculate the hyperbolic cosine of an angle (in radians)
hyperbolic_cosine = math.cosh(1)
print(f"Hyperbolic cosine of 1 radian: {hyperbolic_cosine}")

# Calculate the hyperbolic tangent of an angle (in radians)
hyperbolic_tangent = math.tanh(1)
print(f"Hyperbolic tangent of 1 radian: {hyperbolic_tangent}")

10. Error Functions and Complementary Error Function

import math

# Calculate the error function (erf) for a real argument x
x = 0.5
error_function_value = math.erf(x)
print(f"Error function of {x}: {error_function_value}")

# Calculate the complementary error function (erfc) for a real argument x
complementary_error_function_value = math.erfc(x)
print(f"Complementary error function of {x}: {complementary_error_function_value}")

11. Constants and Special Values

import math

# Access special values defined in the math module
pi_over_4 = math.pi / 4
negative_zero = -0.0
inf_pos = math.inf
inf_neg = -math.inf
nan_val = math.nan

print(f"ฯ€/4: {pi_over_4}")
print(f"Negative zero: {negative_zero}")
print(f"Infinity (positive): {inf_pos}")
print(f"Infinity (negative): {inf_neg}")
print(f"Not a Number (NaN): {nan_val}")

12. Pi and E Constants

import math

# Access the mathematical constants ฯ€ and e
pi_value = math.pi
e_value = math.e

print(f"Value of ฯ€: {pi_value}")
print(f"Value of e: {e_value}")

These examples cover a wide range of functionalities provided by the math module, demonstrating how to use various mathematical operations effectively in Python. Each example includes comments explaining the purpose and usage of each function or constant, ensuring clarity for beginners and advanced users alike.

numbers - Numeric abstract base classes.md

numbers - Numeric abstract base classes

The numbers module in Python provides an abstract base class hierarchy for numeric types, which can serve as a foundation for creating custom numeric types. Here are comprehensive examples demonstrating various functionalities provided by this module:

from abc import ABCMeta, abstractmethod
from math import sqrt, log, exp  # Added necessary imports

# Define the Number class
class Number(metaclass=ABCMeta):
    @abstractmethod
    def __add__(self, other):
        pass

    @abstractmethod
    def __sub__(self, other):
        pass

    @abstractmethod
    def __mul__(self, other):
        pass

    @abstractmethod
    def __truediv__(self, other):
        pass

    @abstractmethod
    def __floordiv__(self, other):
        pass

    @abstractmethod
    def __mod__(self, other):
        pass

    @abstractmethod
    def __pow__(self, other):
        pass

    @abstractmethod
    def __lt__(self, other):
        pass

    @abstractmethod
    def __le__(self, other):
        pass

    @abstractmethod
    def __eq__(self, other):
        pass

    @abstractmethod
    def __ne__(self, other):
        pass

    @abstractmethod
    def __gt__(self, other):
        pass

    @abstractmethod
    def __ge__(self, other):
        pass

    @abstractmethod
    def __neg__(self):
        pass

    @abstractmethod
    def __abs__(self):
        pass

# Define the Real class, which is a subclass of Number
class Real(Number):
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        return Real(self.value + other)

    def __sub__(self, other):
        return Real(self.value - other)

    def __mul__(self, other):
        return Real(self.value * other)

    def __truediv__(self, other):
        if other == 0:
            raise ZeroDivisionError("division by zero")
        return Real(self.value / other)

    def __floordiv__(self, other):
        if other == 0:
            raise ZeroDivisionError("division by zero")
        return Real(self.value // other)

    def __mod__(self, other):
        if other == 0:
            raise ZeroDivisionError("modulo by zero")
        return Real(self.value % other)

    def __pow__(self, other):
        return Real(pow(self.value, other))

    def __lt__(self, other):
        return self.value < other

    def __le__(self, other):
        return self.value <= other

    def __eq__(self, other):
        return self.value == other

    def __ne__(self, other):
        return self.value != other

    def __gt__(self, other):
        return self.value > other

    def __ge__(self, other):
        return self.value >= other

    def __neg__(self):
        return Real(-self.value)

    def __abs__(self):
        return Real(abs(self.value))

# Define the Complex class, which is a subclass of Number
class Complex(Number):
    def __init__(self, real=0.0, imag=0.0):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        if isinstance(other, Real):
            return Complex(self.real + other.value, self.imag)
        elif isinstance(other, Complex):
            return Complex(self.real + other.real, self.imag + other.imag)
        else:
            raise TypeError("unsupported operand type(s) for +: 'Complex' and '{}'".format(type(other).__name__))

    def __sub__(self, other):
        if isinstance(other, Real):
            return Complex(self.real - other.value, self.imag)
        elif isinstance(other, Complex):
            return Complex(self.real - other.real, self.imag - other.imag)
        else:
            raise TypeError("unsupported operand type(s) for -: 'Complex' and '{}'".format(type(other).__name__))

    def __mul__(self, other):
        if isinstance(other, Real):
            return Complex(self.real * other.value, self.imag * other.value)
        elif isinstance(other, Complex):
            r = self.real * other.real - self.imag * other.imag
            i = self.real * other.imag + self.imag * other.real
            return Complex(r, i)
        else:
            raise TypeError("unsupported operand type(s) for *: 'Complex' and '{}'".format(type(other).__name__))

    def __truediv__(self, other):
        if isinstance(other, Real):
            if other == 0:
                raise ZeroDivisionError("division by zero")
            r = self.real / other
            i = self.imag / other
            return Complex(r, i)
        elif isinstance(other, Complex):
            denom = pow(other.real, 2) + pow(other.imag, 2)
            r = (self.real * other.real + self.imag * other.imag) / denom
            i = (self.imag * other.real - self.real * other.imag) / denom
            return Complex(r, i)
        else:
            raise TypeError("unsupported operand type(s) for /: 'Complex' and '{}'".format(type(other).__name__))

    def __floordiv__(self, other):
        if isinstance(other, Real):
            if other == 0:
                raise ZeroDivisionError("division by zero")
            r = self.real // other
            i = self.imag // other
            return Complex(r, i)
        elif isinstance(other, Complex):
            denom = pow(other.real, 2) + pow(other.imag, 2)
            r = (self.real * other.real + self.imag * other.imag) // denom
            i = (self.imag * other.real - self.real * other.imag) // denom
            return Complex(r, i)
        else:
            raise TypeError("unsupported operand type(s) for //: 'Complex' and '{}'".format(type(other).__name__))

    def __mod__(self, other):
        if isinstance(other, Real):
            if other == 0:
                raise ZeroDivisionError("modulo by zero")
            return Complex(self.real % other)
        elif isinstance(other, Complex):
            raise TypeError("unsupported operand type(s) for %: 'Complex' and '{}'".format(type(other).__name__))
        else:
            raise TypeError("unsupported operand type(s) for %: 'Complex' and '{}'".format(type(other).__name__))

    def __pow__(self, other):
        if isinstance(other, Real):
            return Complex(pow(self.real, other), pow(self.imag, other))
        elif isinstance(other, Complex):
            r = pow(pow(self.real, 2) + pow(self.imag, 2), other.real)
            i = (other.real * log(pow(self.real, 2) + pow(self.imag, 2))) * exp(log(abs(self)) * other.imag / 2)
            return Complex(r, i)
        else:
            raise TypeError("unsupported operand type(s) for **: 'Complex' and '{}'".format(type(other).__name__))

    def __lt__(self, other):
        if isinstance(other, Real):
            return abs(self) < abs(other)
        elif isinstance(other, Complex):
            return abs(self) < abs(other)
        else:
            raise TypeError("unsupported operand type(s) for <: 'Complex' and '{}'".format(type(other).__name__))

    def __le__(self, other):
        if isinstance(other, Real):
            return abs(self) <= abs(other)
        elif isinstance(other, Complex):
            return abs(self) <= abs(other)
        else:
            raise TypeError("unsupported operand type(s) for <=: 'Complex' and '{}'".format(type(other).__name__))

    def __eq__(self, other):
        if isinstance(other, Real):
            return self.real == other.value and self.imag == 0
        elif isinstance(other, Complex):
            return self.real == other.real and self.imag == other.imag
        else:
            raise TypeError("unsupported operand type(s) for ==: 'Complex' and '{}'".format(type(other).__name__))

    def __ne__(self, other):
        if isinstance(other, Real):
            return self.real != other.value or self.imag != 0
        elif isinstance(other, Complex):
            return self.real != other.real or self.imag != other.imag
        else:
            raise TypeError("unsupported operand type(s) for !=: 'Complex' and '{}'".format(type(other).__name__))

    def __gt__(self, other):
        if isinstance(other, Real):
            return abs(self) > abs(other)
        elif isinstance(other, Complex):
            return abs(self) > abs(other)
        else:
            raise TypeError("unsupported operand type(s) for >: 'Complex' and '{}'".format(type(other).__name__))

    def __ge__(self, other):
        if isinstance(other, Real):
            return abs(self) >= abs(other)
        elif isinstance(other, Complex):
            return abs(self) >= abs(other)
        else:
            raise TypeError("unsupported operand type(s) for >=: 'Complex' and '{}'".format(type(other).__name__))

    def __neg__(self):
        return Complex(-self.real, -self.imag)

    def __abs__(self):
        return sqrt(pow(self.real, 2) + pow(self.imag, 2))

    def __str__(self):
        return f"{self.real} + {self.imag}i"

# Example usage
c1 = Complex(3, 4)
c2 = Complex(1, 2)

print(c1 + c2)  # Output: 4 + 6i
print(c1 * c2)  # Output: -5 + 14i

This implementation provides basic complex number operations such as addition, multiplication, and comparison. Note that this is a simple example and does not include all the methods required by the complex class in Python. You might want to extend it to handle more features or optimizations depending on your needs. In real-world applications, you would typically use Python's built-in complex class for complex number operations.

random - Generate pseudo-random numbers.md

random - Generate Pseudo-Random Numbers

The random module in Python provides various functions to generate pseudo-random numbers, which are useful for simulations, cryptography, and more. Below are comprehensive examples of how to use this module to generate different types of random numbers.

1. Basic Random Number Generation

To generate a random integer within a specified range, you can use the randint() function:

import random

# Generate a random integer between 1 and 10 (inclusive)
random_integer = random.randint(1, 10)
print("Random Integer:", random_integer)

# Generate a random integer between -5 and 5 (inclusive)
random_integer_negative = random.randint(-5, 5)
print("Random Integer (negative range):", random_integer_negative)

2. Random Floating-Point Numbers

To generate a floating-point number within a specified range, you can use the uniform() function:

import random

# Generate a random floating-point number between 0 and 1
random_float = random.uniform(0, 1)
print("Random Float:", random_float)

# Generate a random floating-point number between 3.5 and 7.8
random_float_custom_range = random.uniform(3.5, 7.8)
print("Random Float (custom range):", random_float_custom_range)

3. Random Choice from a List

To select a random element from a list, you can use the choice() function:

import random

fruits = ['apple', 'banana', 'cherry', 'date']
random_fruit = random.choice(fruits)
print("Random Fruit:", random_fruit)

# Selecting multiple random elements without replacement
random_fruits_multiple = random.sample(fruits, 3)
print("Random Fruits (multiple selection without replacement):", random_fruits_multiple)

4. Random Selection with Replacement

To select a random element from a list and allow replacement (i.e., selecting the same element multiple times), you can use the choices() function:

import random

fruits = ['apple', 'banana', 'cherry', 'date']
random_fruits_with_replacement = random.choices(fruits, k=3)
print("Random Fruits (with replacement):", random_fruits_with_replacement)

5. Random Shuffle a List

To shuffle the elements of a list in place, you can use the shuffle() function:

import random

fruits = ['apple', 'banana', 'cherry', 'date']
random.shuffle(fruits)
print("Shuffled Fruits:", fruits)

# Note: The original list is modified in place

6. Random Seed for Reproducibility

To ensure that your random number generation is reproducible, you can set a seed using the seed() function:

import random

random.seed(42)
print("Random Number with Seed:", random.randint(1, 10))

# Using the same seed will produce the same random numbers
random.seed(42)
print("Another Random Number with Same Seed:", random.randint(1, 10))

7. Random Normal Distribution

To generate random numbers from a normal distribution, you can use the normalvariate() function:

import random

# Generate a random number from a normal distribution with mean 0 and standard deviation 1
random_normal = random.normalvariate(0, 1)
print("Random Normal Number:", random_normal)

# Generate multiple numbers from a normal distribution
random_normals = [random.normalvariate(0, 1) for _ in range(5)]
print("Random Normals:", random_normals)

8. Random Binomial Distribution

To generate random numbers from a binomial distribution, you can use the binomial() function:

pip install numpy

import numpy as np

# Generate a random number from a binomial distribution with parameters n=10 and p=0.5
random_binomial = np.random.binomial(10, 0.5)
print("Random Binomial Number:", random_binomial)

# Generate multiple numbers from a binomial distribution
random_bins = [np.random.binomial(10, 0.5) for _ in range(5)]
print("Random Bins:", random_bins)

9. Random Exponential Distribution

To generate random numbers from an exponential distribution, you can use the expovariate() function:

import random

# Generate a random number from an exponential distribution with rate parameter ฮป=1
random_exponential = random.expovariate(1)
print("Random Exponential Number:", random_exponential)

# Generate multiple numbers from an exponential distribution
random_expenses = [random.expovariate(0.5) for _ in range(5)]
print("Random Expenses:", random_expenses)

10. Random Choices with Weights

To generate a list of random choices based on weights, you can use the choices() function:

import random

fruits = ['apple', 'banana', 'cherry', 'date']
weights = [2, 3, 1, 4]  # Corresponding to the frequency of each fruit

random_fruits_weighted = random.choices(fruits, weights=weights, k=5)
print("Random Fruits with Weights:", random_fruits_weighted)

Conclusion

The random module in Python provides a wide range of functions to generate various types of pseudo-random numbers. These examples cover basic operations like generating integers and floats, selecting elements from lists, shuffling lists, and generating numbers from different distributions. By using these functions, you can effectively incorporate randomness into your applications for simulations, games, and more.

statistics - Mathematical statistics functions.md

statistics - Mathematical statistics functions

The statistics module in Python provides a collection of mathematical statistical functions. Below are comprehensive and well-documented examples for every possible functionality within this module, following best practices and suitable for inclusion in official documentation.

1. Calculating Mean

import statistics

# Example 1: Calculate the mean of a list of numbers
numbers = [10, 20, 30, 40, 50]
mean_value = statistics.mean(numbers)
print(f"Mean of {numbers}: {mean_value}")

2. Calculating Median

import statistics

# Example 2: Calculate the median of a list of numbers
numbers = [10, 20, 30, 40, 50]
median_value = statistics.median(numbers)
print(f"Median of {numbers}: {median_value}")

3. Calculating Mode

import statistics

# Example 3: Calculate the mode of a list of numbers
data = [1, 2, 2, 3, 4, 5, 5]
mode_value = statistics.mode(data)
print(f"Mode of {data}: {mode_value}")

4. Calculating Standard Deviation

import statistics

# Example 4: Calculate the standard deviation of a list of numbers
data = [10, 20, 30, 40, 50]
std_dev_value = statistics.stdev(data)
print(f"Standard Deviation of {data}: {std_dev_value}")

5. Calculating Variance

import statistics

# Example 5: Calculate the variance of a list of numbers
data = [10, 20, 30, 40, 50]
variance_value = statistics.variance(data)
print(f"Variance of {data}: {variance_value}")

6. Calculating Quartiles

import statistics

# Example 6: Calculate the quartiles of a list of numbers
numbers = [10, 20, 30, 40, 50]
quartiles = statistics.quantiles(numbers)
print(f"Quartiles of {numbers}: {quartiles}")

7. Handling Large Data Sets

import statistics

# Example 7: Calculate the mean of a large dataset using the 'statistics' module
large_data = list(range(10000))  # Generates a list of numbers from 0 to 9999
mean_large_value = statistics.mean(large_data)
print(f"Mean of {len(large_data)} elements: {mean_large_value}")

8. Handling Missing Values

import statistics

# Example 8: Calculate the mean while ignoring missing values (NaNs) in a list
numbers_with_nan = [10, 20, float('nan'), 40, 50]
mean_nan_ignored = statistics.mean(numbers_with_nan)
print(f"Mean of {numbers_with_nan} with NaN ignored: {mean_nan_ignored}")

9. Handling Negative Numbers

import statistics

# Example 9: Calculate the mean of a list containing negative numbers
negative_numbers = [-10, -20, -30, -40, -50]
mean_negative_value = statistics.mean(negative_numbers)
print(f"Mean of {negative_numbers}: {mean_negative_value}")

10. Handling Outliers

import statistics

# Example 10: Calculate the mean while ignoring outliers using the 'statistics' module's robust statistics approach
numbers_with_outlier = [10, 20, 30, 4000, 50]
mean_robust_value = statistics.median(numbers_with_outlier)
print(f"Robust mean of {numbers_with_outlier}: {mean_robust_value}")

11. Handling Non-Numbers

import statistics

# Example 11: Calculate the mean while ignoring non-numbers in a list
mixed_data = [10, 'a', 20, float('inf'), 40, 50]
mean_non_number_ignored = statistics.mean(mixed_data)
print(f"Mean of {len(mixed_data)} elements with non-numbers ignored: {mean_non_number_ignored}")

12. Handling Large Number of Duplicates

import statistics

# Example 12: Calculate the mode of a list with multiple modes using the 'statistics' module's robust approach
data_with_multiple_modes = [1, 1, 2, 2, 3, 4]
mode_robust_value = statistics.mode(data_with_multiple_modes)
print(f"Robust mode of {data_with_multiple_modes}: {mode_robust_value}")

13. Handling Small Sample Sizes

import statistics

# Example 13: Calculate the mean and standard deviation for a small sample size
small_sample = [1, 2, 3, 4]
mean_small_sample = statistics.mean(small_sample)
std_dev_small_sample = statistics.stdev(small_sample)
print(f"Mean of {small_sample}: {mean_small_sample}")
print(f"Standard Deviation of {small_sample}: {std_dev_small_sample}")

14. Handling Continuous Data

import statistics

# Example 14: Calculate the mean and median for a continuous dataset
continuous_data = [0.5, 1.5, 2.5, 3.5, 4.5]
mean_continuous_value = statistics.mean(continuous_data)
median_continuous_value = statistics.median(continuous_data)
print(f"Mean of {continuous_data}: {mean_continuous_value}")
print(f"Median of {continuous_data}: {median_continuous_value}")

15. Handling Discrete Data

import statistics

# Example 15: Calculate the mode for a discrete dataset
discrete_data = [1, 2, 3, 4, 5]
mode_discrete_value = statistics.mode(discrete_data)
print(f"Mode of {discrete_data}: {mode_discrete_value}")

These examples cover various aspects of statistical calculations using the statistics module in Python. Each example includes comments explaining the purpose and functionality of the code, making it suitable for documentation and educational purposes.

Program Frameworks

cmd - Support for line-oriented command interpreters.md

cmd - Support for line-oriented command interpreters

The cmd module in Python provides a framework for writing line-oriented command interpreters, allowing you to create simple text-based interfaces for interacting with commands and processes.

Here are some comprehensive code examples that cover various functionalities of the cmd module. These examples are designed to be clear, concise, and follow best practices suitable for inclusion in official documentation.

Example 1: Basic Command Interpreter

import cmd

class SimpleInterpreter(cmd.Cmd):
    prompt = '(simple) '

    def do_hello(self, arg):
        """Print a greeting."""
        print("Hello!")

    def do_exit(self, arg):
        """Exit the interpreter."""
        return True

if __name__ == '__main__':
    SimpleInterpreter().cmdloop()

Example 2: Command with Arguments

import cmd

class Calculator(cmd.Cmd):
    prompt = '(calc) '

    def do_add(self, arg):
        """Add two numbers."""
        try:
            num1, num2 = map(float, arg.split())
            result = num1 + num2
            print(f"Result: {result}")
        except ValueError:
            print("Please enter valid numbers.")

if __name__ == '__main__':
    Calculator().cmdloop()

Example 3: Command with Flags

import cmd

class FileManipulator(cmd.Cmd):
    prompt = '(file) '

    def do_open(self, arg):
        """Open a file and print its contents."""
        try:
            filename = arg.strip()
            with open(filename, 'r') as file:
                content = file.read()
                print(content)
        except FileNotFoundError:
            print("File not found.")

if __name__ == '__main__':
    FileManipulator().cmdloop()

Example 4: Command History

import cmd

class HistoryInterpreter(cmd.Cmd):
    prompt = '(history) '
    historyfile = None

    def postcmd(self, stop, line):
        """Store the last command in history."""
        if not stop:
            self.historyfile.append(line)
        return True

if __name__ == '__main__':
    HistoryInterpreter().cmdloop()

Example 5: Subclassing Cmd for Custom Commands

import cmd

class MyCommand(cmd.Cmd):
    prompt = '(mycommand) '

    def do_create(self, arg):
        """Create a new file."""
        try:
            filename = arg.strip()
            with open(filename, 'w') as file:
                print(f"File {filename} created.")
        except IOError:
            print("Error creating the file.")

if __name__ == '__main__':
    MyCommand().cmdloop()

Example 6: Using cmd.Cmd in a Web Application

import cmd
from http.server import HTTPServer, BaseHTTPRequestHandler

class CommandHTTPHandler(BaseHTTPRequestHandler):
    prompt = '(command) '

    def do_hello(self, arg):
        """Print a greeting over HTTP."""
        self.send_response(200)
        self.wfile.write(b"Hello!\n")

if __name__ == '__main__':
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, CommandHTTPHandler)
    print("Serving on port 8000...")
    httpd.serve_forever()

These examples demonstrate how to create a simple command interpreter using the cmd module. Each example includes comments that explain the purpose of each part of the code, making it easier for others (or yourself in the future) to understand and modify the code.

These examples can be expanded with more complex features such as error handling, input validation, and more sophisticated command structures to suit a wide range of applications.

shlex - Simple lexical analysis.md

shlex - Simple lexical analysis

The shlex module in Python provides a robust interface for parsing simple command-like strings into tokens, handling quoted strings, escaped characters, and other special cases that are common in shell scripts. Below are comprehensive examples of how to use each functionality provided by the shlex module.

1. Basic Tokenization

The most basic usage involves using the shlex.split() function to tokenize a string into a list of words.

import shlex

# Example command-like string
command = 'echo "Hello, world!"'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['echo', '"Hello, world!"']

2. Handling Quoted Strings

Quoted strings are handled correctly by shlex. Double quotes allow for inclusion of spaces and other special characters within a single token.

import shlex

# Example with quoted string
command = 'ls -l "file with spaces.txt"'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['ls', '-l', '"file with spaces.txt"']

3. Escaping Characters

Backslashes can be used to escape special characters within quoted strings.

import shlex

# Example with escaped character
command = 'echo "This is a \'quoted\' string."'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['echo', '"This is a \'quoted\' string."']

4. Ignoring Comments

The shlex module can ignore comments in strings by setting the commentchars parameter.

import shlex

# Example with comment
command = 'ls -l /path/to/directory # This is a comment'

# Tokenize the command, ignoring comments
tokens = shlex.split(command, commentchars='#')

print(tokens)  # Output: ['ls', '-l', '/path/to/directory']

5. Handling Special Characters

Special characters like $, @, and ! are treated as part of tokens unless they are escaped or quoted.

import shlex

# Example with special character
command = 'echo $HOME'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['echo', '$HOME']

6. Quoting Special Characters

Special characters can be quoted to ensure they are treated as literals.

import shlex

# Example with quoted special character
command = 'echo "$USER"'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['echo', '$USER']

7. Handling Multiple Whitespace

The split() function automatically handles multiple whitespace characters as a single delimiter.

import shlex

# Example with multiple whitespace
command = 'ls -l /path/to/directory '

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['ls', '-l', '/path/to/directory']

8. Handling Non-Latin Characters

The shlex module can handle non-Latin characters correctly, ensuring that they are treated as part of tokens.

import shlex

# Example with non-Latin character
command = 'echo "ใ“ใ‚“ใซใกใฏใ€ไธ–็•Œ"'

# Tokenize the command
tokens = shlex.split(command)

print(tokens)  # Output: ['echo', '"ใ“ใ‚“ใซใกใฏใ€ไธ–็•Œ"']

9. Using shlex in a Script

The shlex module can be used in scripts to parse command-line arguments or user input.

import shlex

# Example script that processes command-line arguments
def process_command(command):
    tokens = shlex.split(command)
    print("Tokens:", tokens)

if __name__ == "__main__":
    # Parse command-line arguments
    import sys
    if len(sys.argv) > 1:
        process_command(sys.argv[1])

10. Using shlex for Parsing Shell Commands

The shlex module can be used to parse shell commands, handling complex structures like pipelines and redirects.

import shlex
import subprocess

# Example of parsing a shell command
command = 'ls -l | grep "file*"'

# Tokenize the command
tokens = shlex.split(command)

print("Tokens:", tokens)  # Output: ['ls', '-l', '|', 'grep', '"file*"', '']

# Execute the command using subprocess
process = subprocess.Popen(tokens, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()

print("Output:", output.decode('utf-8'))
print("Error:", error.decode('utf-8'))

These examples demonstrate various use cases for the shlex module, covering basic tokenization, handling of quotes and special characters, ignoring comments, and using the module in scripts. The code is designed to be clear and self-contained, with appropriate comments explaining each step.

turtle - Turtle graphics.md

turtle - Turtle graphics

The turtle module is a versatile tool in Python that provides a simple way to create visual graphics using turtles, which are animated line segments on the screen. Here are comprehensive and well-documented code examples for various functionalities of the turtle module:

Basic Usage Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Move the turtle forward by 100 units
t.forward(100)

# Turn the turtle left by 90 degrees
t.left(90)

# Draw a square
for _ in range(4):
    t.forward(100)
    t.right(90)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Drawing Shapes Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Draw an equilateral triangle
side_length = 100
for _ in range(3):
    t.forward(side_length)
    t.left(120)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Drawing a Circle Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Draw a circle with radius 50
radius = 50
t.circle(radius)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Customizing Turtle Appearance Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Set the color of the turtle to blue
t.color("blue")

# Set the shape of the turtle to square
t.shape("square")

# Draw a square with side length 100
for _ in range(4):
    t.forward(100)
    t.right(90)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Using Pen Up and Down Commands Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Move the turtle forward by 100 units
t.forward(100)

# Lift up the pen, so the turtle won't draw while moving
t.penup()

# Move the turtle backward by 50 units
t.backward(50)

# Put down the pen again to start drawing
t.pendown()

# Draw a line of length 100 from the current position
t.forward(100)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Drawing Multiple Shapes Example

import turtle

# Create a turtle object
t = turtle.Turtle()

# Draw a square and then a circle
side_length = 100
circle_radius = 50

# Draw an equilateral triangle
for _ in range(3):
    t.forward(side_length)
    t.left(120)

# Move to the position above the square
t.penup()
t.goto(-side_length // 2, side_length // 4)
t.pendown()

# Draw a circle
t.circle(circle_radius)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Using Functions Example

import turtle

# Create a turtle object
t = turtle.Turtle()

def draw_square(t, side_length):
    """Draws a square with the given side length."""
    for _ in range(4):
        t.forward(side_length)
        t.right(90)

def draw_circle(t, radius):
    """Draws a circle with the given radius."""
    t.circle(radius)

# Draw a square and then a circle
side_length = 100
circle_radius = 50

draw_square(t, side_length)
t.penup()
t.goto(-side_length // 2, side_length // 4)
t.pendown()

draw_circle(t, circle_radius)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Using Event Handling Example

import turtle

# Create a turtle object
t = turtle.Turtle()

def draw_square(event):
    """Draws a square in response to mouse click."""
    t.penup()
    x, y = event.x, event.y
    t.goto(x, y)
    t.pendown()
    for _ in range(4):
        t.forward(50)
        t.right(90)

# Bind the draw_square function to the left button of the mouse
turtle.onscreenclick(draw_square)

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

Using Screen Properties Example

import turtle

# Create a screen object with a specific background color
screen = turtle.Screen()
screen.bgcolor("lightblue")

# Create a turtle object
t = turtle.Turtle()

# Draw a square and then change the background color to yellow
side_length = 100
circle_radius = 50

draw_square(t, side_length)
t.penup()
t.goto(-side_length // 2, side_length // 4)
t.pendown()

draw_circle(t, circle_radius)

# Change the background color of the screen
screen.bgcolor("yellow")

# Hide the turtle and exit on click
t.hideturtle()
turtle.done()

These examples cover a range of functionalities available in the turtle module, from basic drawing commands to more advanced features like event handling and screen properties. They are designed to be clear, concise, and suitable for inclusion in official documentation or educational materials.

Python Language Services

ast - Abstract Syntax Trees.md

ast - Abstract Syntax Trees

The ast module in Python is used to parse Python source code into an abstract syntax tree (AST). This AST can then be transformed or analyzed using various functions provided by the module. Below are comprehensive and well-documented code examples for each functionality available in the ast module.

1. Parsing Source Code

import ast

# Sample Python source code as a string
source_code = """
def add(a, b):
    return a + b

result = add(3, 5)
"""

# Parse the source code into an AST
tree = ast.parse(source_code)

# Print the AST in a readable format
print(ast.dump(tree))

Explanation: - ast.parse(source_code): Parses the given Python source code string into an abstract syntax tree (AST). - ast.dump(tree): Prints the AST in a human-readable format.

2. Walking the AST

import ast

# Sample AST from the previous example
tree = ast.parse(source_code)

def traverse(node, indent=0):
    print(' ' * indent + node.__class__.__name__)
    for child in ast.iter_child_nodes(node):
        traverse(child, indent + 4)

# Traverse the AST and print each node's class name
traverse(tree)

Explanation: - ast.iter_child_nodes(node): Iterates over all child nodes of a given AST node. - The traverse function is used to recursively print the structure of the AST, indenting each level for better readability.

3. Modifying the AST

import ast

# Sample AST from the previous example
tree = ast.parse(source_code)

def modify(node):
    if isinstance(node, ast.FunctionDef) and node.name == 'add':
        # Modify the function definition to include a docstring
        node.body.insert(0, ast.Expr(value=ast.Str(s='This is a modified add function')))

# Traverse the AST and modify nodes as needed
modify(tree)

# Reconstruct the source code from the modified AST
modified_source_code = compile(tree, '<input>', 'exec')

Explanation: - isinstance(node, ast.FunctionDef) and node.name == 'add': Checks if a node is a function definition named add. - node.body.insert(0, ast.Expr(value=ast.Str(s='This is a modified add function'))) inserts a docstring at the beginning of the function's body. - compile(tree, '<input>', 'exec'): Converts the modified AST back into Python source code.

4. Evaluating an AST

import ast
import operator as op

# Sample AST from the previous example
tree = ast.parse(source_code)

def evaluate(node):
    if isinstance(node, ast.Num):
        return node.n
    elif isinstance(node, ast.BinOp):
        left = evaluate(ast.walk(node)[0])
        right = evaluate(ast.walk(node)[-1])
        operators = {
            ast.Add: op.add,
            ast.Sub: op.sub,
            ast.Mult: op.mul,
            ast.Div: op.truediv,
            ast.Pow: op.pow
        }
        return operators[type(node.op)](left, right)
    else:
        raise ValueError(f"Unsupported node type: {node.__class__.__name__}")

# Evaluate the AST to compute the result of the `add` function call
result = evaluate(tree.body[0].value.args[1])
print(result)

Explanation: - ast.walk(node): Generates a sequence of all nodes in the AST, which is then used to access specific nodes like numbers and binary operations. - operators[type(node.op)](left, right): Maps binary operation node types to their corresponding Python operators for evaluation.

5. Extracting Information from an AST

import ast

# Sample AST from the previous example
tree = ast.parse(source_code)

def extract_functions(tree):
    functions = []
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            functions.append(node.name)
    return functions

# Extract all function names from the AST
function_names = extract_functions(tree)
print(function_names)

Explanation: - ast.walk(tree): Iterates over all nodes in the AST. - isinstance(node, ast.FunctionDef): Checks if a node is a function definition. - Collects all function names into a list and returns it.

These examples demonstrate various ways to use the ast module for parsing, analyzing, and modifying Python source code programmatically. The examples are designed to be clear, concise, and suitable for inclusion in official documentation.

compileall - Byte-compile Python libraries.md

compileall - Byte-compile Python libraries

The compileall module in Python is used to byte-compile all modules within a specified directory, which can help improve the performance of your Python application by compiling source files into bytecode during execution. Below are comprehensive code examples for using the compileall module.

Example 1: Byte-Compile All Modules in a Directory

This example demonstrates how to use compileall.compile_dir() to byte-compile all modules in a directory.

import compileall

# Specify the directory to be compiled
directory_to_compile = '/path/to/your/python/library'

# Compile all Python files in the specified directory
compiled_files = compileall.compile_dir(directory=directory_to_compile)

# Print the list of compiled files
print("Compiled files:", compiled_files)

Explanation:

  1. Import compileall: Start by importing the compileall module.
  2. Specify the Directory: Define the path to the directory containing your Python modules that you want to compile.
  3. Compile All Files: Use compileall.compile_dir() with the specified directory. This function returns a list of filenames that were compiled.
  4. Print Compiled Files: Print the list of files that were successfully compiled.

Example 2: Byte-Compile Only Modified Modules

This example shows how to use compileall.compile_dir() with the force parameter to byte-compile only modified modules since the last compilation.

import compileall

# Specify the directory to be compiled
directory_to_compile = '/path/to/your/python/library'

# Compile only modified files, including those that were already compiled but have been updated
compiled_files = compileall.compile_dir(directory=directory_to_compile, force=True)

# Print the list of compiled files
print("Compiled files:", compiled_files)

Explanation:

  1. Import compileall: Again, import the compileall module.
  2. Specify the Directory: Define the path to the directory containing your Python modules.
  3. Compile Only Modified Files: Use compileall.compile_dir() with the force=True parameter. This ensures that only files that have been modified since their last compilation are compiled again.
  4. Print Compiled Files: Print the list of files that were successfully compiled, including any that were already present but updated.

Example 3: Compile All Modules in a Directory and Output Errors to a File

This example demonstrates how to use compileall.compile_dir() with an output file to capture any errors that occur during compilation.

import compileall

# Specify the directory to be compiled
directory_to_compile = '/path/to/your/python/library'

# Specify the output file for error messages
output_file = 'compile_errors.txt'

# Compile all Python files in the specified directory and write errors to a file
compiled_files, errors = compileall.compile_dir(directory=directory_to_compile, force=True, quiet=False)

# Print the list of compiled files and any errors encountered
print("Compiled files:", compiled_files)
print("Errors:")
for error in errors:
    print(error)

Explanation:

  1. Import compileall: Import the compileall module.
  2. Specify the Directory: Define the path to the directory containing your Python modules.
  3. Compile All Files and Capture Errors: Use compileall.compile_dir() with force=True and quiet=False. The quiet=False parameter ensures that errors are printed during compilation, and the results are also captured in a file specified by output_file.
  4. Print Compiled Files and Errors: Print the list of files that were compiled and any error messages that occurred.

Example 4: Compile All Modules in a Directory with Optimization

This example shows how to use compileall.compile_dir() to byte-compile all modules in a directory, optimizing them for performance.

import compileall

# Specify the directory to be compiled
directory_to_compile = '/path/to/your/python/library'

# Compile all Python files in the specified directory with optimization level 2
compiled_files = compileall.compile_dir(directory=directory_to_compile, force=True, optimize=2)

# Print the list of compiled files
print("Compiled files:", compiled_files)

Explanation:

  1. Import compileall: Import the compileall module.
  2. Specify the Directory: Define the path to the directory containing your Python modules.
  3. Compile All Files with Optimization: Use compileall.compile_dir() with force=True and optimize=2. The optimization level 2 enables more aggressive optimizations, which can improve performance.
  4. Print Compiled Files: Print the list of files that were successfully compiled.

These examples provide a comprehensive overview of using the compileall module in Python to byte-compile your Python libraries. Each example demonstrates different use cases and options available for fine-tuning the compilation process.

dis - Disassembler for Python bytecode.md

dis - Disassembler for Python bytecode

The dis module is a part of the Python standard library that provides a way to examine Python bytecode. It can help you understand how Python programs are executed and debug them. Below are several comprehensive examples demonstrating various functionalities of the dis module.

1. Basic Disassembly

import dis

# Example function to demonstrate basic disassembly
def example_function(x):
    return x * 2 + 3

# Get bytecode for the function
bytecode = example_function.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

2. Disassembling a Built-in Function

import dis

# Disassemble the built-in sum function
dis.dis(sum)

3. Iterating Over Instructions

import dis

def print_instructions(func):
    # Get bytecode for the function
    bytecode = func.__code__.co_code

    # Iterate over instructions and print them
    for offset, instruction in enumerate(dis.get_instructions(bytecode)):
        print(f"{offset:04d}: {instruction.opname} {instruction.argval}")

# Example function to demonstrate iterating over instructions
def example_function(x):
    return x * 2 + 3

print_instructions(example_function)

4. Disassembling a Module

import dis
import inspect

# Get bytecode for the current module
module = inspect.currentframe().f_code.co_filename
with open(module, 'rb') as f:
    bytecode = f.read()

# Disassemble the bytecode of the entire module
dis.dis(bytecode)

5. Disassembling a Class Method

import dis

class MyClass:
    @staticmethod
    def my_method(x):
        return x * 2 + 3

# Get bytecode for the class method
bytecode = MyClass.my_method.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

6. Disassembling a Module with Decorators

import dis
import inspect

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Decorator called")
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example_function(x):
    return x * 2 + 3

# Get bytecode for the decorated function
bytecode = example_function.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

7. Disassembling a Generator Function

import dis

def count_up_to(n):
    i = 0
    while i < n:
        yield i
        i += 1

# Get bytecode for the generator function
bytecode = count_up_to.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

8. Disassembling a List Comprehension

import dis

def list_comprehension_example():
    return [x * 2 + 3 for x in range(5)]

# Get bytecode for the list comprehension
bytecode = list_comprehension_example.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

9. Disassembling a Nested Function

import dis

def outer_function(x):
    def inner_function(y):
        return x * y + 3

    return inner_function(2)

# Get bytecode for the nested function
bytecode = outer_function.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

10. Disassembling a Function with Keyword Arguments

import dis

def example_function_with_kwargs(x, y=3):
    return x * y + 2

# Get bytecode for the function with keyword arguments
bytecode = example_function_with_kwargs.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

11. Disassembling a Function with Default Values

import dis

def example_function_with_defaults(x, y=3):
    return x * y + 2

# Get bytecode for the function with default values
bytecode = example_function_with_defaults.__code__.co_code

# Disassemble the bytecode
dis.dis(bytecode)

These examples cover a range of functionalities within the dis module, from basic disassembly to more complex scenarios involving decorators and nested functions. Each example is thoroughly documented to help understand how to use each feature effectively.

keyword - Testing for Python keywords.md

keyword - Testing for Python keywords

The keyword module in Python is used to test if a given string is a reserved word in the language. It provides a function called iskeyword() that returns True if the string is a keyword and False otherwise.

Here are some examples of how to use the keyword module:

Example 1: Basic Usage

import keyword

# Check if 'def' is a keyword
print(keyword.iskeyword('def'))  # Output: True

# Check if 'if' is also a keyword
print(keyword.iskeyword('if'))    # Output: True

# Check if 'not' is not a keyword
print(keyword.iskeyword('not'))   # Output: False

# Check if '0x123' is not a keyword
print(keyword.iskeyword('0x123'))  # Output: False

Example 2: Using all() with keyword.iskeyword()

import keyword

# List of words to test
words_to_test = ['def', 'if', 'not', '0x123', 'True']

# Check if all elements in the list are keywords
print(all(keyword.iskeyword(word) for word in words_to_test))  # Output: True

Example 3: Handling Non-String Inputs

import keyword

# Attempt to use iskeyword() with a non-string input
try:
    print(keyword.iskeyword(123))   # Raises TypeError
except TypeError as e:
    print(e)  # Output: iskeyword() argument must be a string, not int

Example 4: Testing Keywords in Specific Contexts

import keyword

# Check if keywords are correctly recognized in function definitions
def my_function():
    pass

print(keyword.iskeyword('my_function'))  # Output: False

# Define a local variable named 'for'
for i in range(10):
    pass

print(keyword.iskeyword('for'))  # Output: True

# Check if keywords are correctly recognized in class definitions
class MyClass:
    pass

print(keyword.iskeyword('MyClass'))  # Output: False

Example 5: Using list() to Get All Keywords

import keyword

# Convert all keywords into a list
all_keywords = list(keyword.kwlist)

# Print the first and last keywords in the list
print("First keyword:", all_keywords[0])  # Output: 'False'
print("Last keyword:", all_keywords[-1])   # Output: 'yield'

Example 6: Using in Operator to Check if a String is a Keyword

import keyword

# List of words to check against keywords
words = ['def', 'if', 'else', 'return']

# Use the in operator to check each word
for word in words:
    print(f"'{word}' is a keyword: {keyword.iskeyword(word)}")

Example 7: Testing Keywords in Different Programming Styles

import keyword

# Define a function using keyword-style argument assignment
def my_function(name='World'):
    print(f'Hello, {name}!')

# Check if 'print' and 'if' are keywords
print(keyword.iskeyword('print'))   # Output: False
print(keyword.iskeyword('if'))    # Output: True

# Define a class with keyword-style member variables
class MyClass:
    def __init__(self, name):
        self.name = name

# Check if 'name' is a keyword
print(keyword.iskeyword('name'))  # Output: False

Example 8: Testing Keywords in Different Module Contexts

import keyword

# Define a function using keyword-style argument assignment in another module
def my_function(name='World'):
    print(f'Hello, {name}!')

# Check if 'print' and 'if' are keywords
print(keyword.iskeyword('print'))   # Output: False
print(keyword.iskeyword('if'))    # Output: True

# Define a class with keyword-style member variables in another module
class MyClass:
    def __init__(self, name):
        self.name = name

# Check if 'name' is a keyword
print(keyword.iskeyword('name'))  # Output: False

These examples demonstrate various use cases of the keyword module, including basic testing, handling non-string inputs, and understanding keywords in different programming contexts.

parser - Access Python parse trees.md

parser - Access Python parse trees

The parser module in Python is not a standard module, but it can be used to parse text files using regular expressions or simple parsing techniques. However, if you are referring to parsing HTML or XML documents, there are more suitable modules like html.parser and xml.etree.ElementTree.

For those interested in parsing text with regular expressions or other basic parsing techniques, I can provide examples of how to use the re module for pattern matching:

import re

# Example 1: Simple pattern matching using re.match()
pattern = r'hello'
text = 'hello world!'
match = re.match(pattern, text)

if match:
    print('Pattern found:', match.group())
else:
    print('Pattern not found.')

# Example 2: Finding all occurrences of a pattern
pattern = r'\bword\b'
text = 'This is a word and another word.'
matches = re.findall(pattern, text)
print('Found words:', matches)

# Example 3: Using regular expressions for simple parsing
def parse_phone_number(text):
    pattern = r'(\+\d{1,2}\s?)?(\(?\d{3}\)?[-.\s]?)\d{3}[-.\s]?\d{4}'
    match = re.search(pattern, text)
    if match:
        return match.group()
    else:
        return 'No phone number found.'

text = "Contact: 123-456-7890 or +1 (401) 555-1234"
print('Parsed phone number:', parse_phone_number(text))

Notes:

If you are looking to parse HTML or XML documents, consider using the html.parser or xml.etree.ElementTree modules:

Example for Parsing HTML with html.parser:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print('Start tag:', tag)
        for attr in attrs:
            print('Attribute:', attr)

    def handle_endtag(self, tag):
        print('End tag  :', tag)

    def handle_data(self, data):
        print('Data     :', data)

html = """
<html>
<head><title>Test</title></head>
<body>
<p>This is a <a href="https://example.com">link</a>.</p>
</body>
</html>
"""

parser = MyHTMLParser()
parser.feed(html)

Example for Parsing XML with xml.etree.ElementTree:

import xml.etree.ElementTree as ET

xml_data = """
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>36.99</price>
    </book>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J.K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>
"""

root = ET.fromstring(xml_data)

for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    year = book.find('year').text
    price = book.find('price').text
    print(f"Title: {title}, Author: {author}, Year: {year}, Price: {price}")

These examples demonstrate how to parse simple text patterns and XML documents using Python's standard libraries. For parsing HTML, html.parser is sufficient for basic tasks; for more complex scenarios, consider using libraries like BeautifulSoup or lxml.

pickletools - Tools for pickle developers.md

pickletools - Tools for pickle developers

The pickletools module in Python provides tools for examining and debugging pickled data, which is used to serialize and deserialize objects. Below are comprehensive code examples for each functionality provided by pickletools, including comments explaining each step.

# Example 1: Inspecting a Pickle File

import pickletools

def inspect_pickle_file(filename):
    # Open the pickle file in binary read mode
    with open(filename, 'rb') as f:
        # Load and parse the pickle data
        parsed_data = pickletools.dis(f)

        # Print the disassembly of the pickled data
        for line in parsed_data.splitlines():
            print(line)

# Example usage
inspect_pickle_file('example.pkl')

Explanation:

Example 2: Extracting Source Code from a Pickled Object

import pickletools

def extract_source_code(obj):
    # Create an in-memory buffer and write the object to it
    import io
    buf = io.BytesIO()
    pickle.dump(obj, buf)

    # Get the bytecode of the pickled data
    bytecodes = buf.getvalue()

    # Disassemble the bytecodes
    parsed_data = pickletools.dis(bytecodes)

    # Print the disassembly
    for line in parsed_data.splitlines():
        print(line)

# Example usage
class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(42)
extract_source_code(obj)

Explanation:

Example 3: Generating Python Source Code for a Pickled Object

import pickletools
import ast

def generate_python_source_code(obj):
    # Create an in-memory buffer and write the object to it
    import io
    buf = io.BytesIO()
    pickle.dump(obj, buf)

    # Get the bytecodes of the pickled data
    bytecodes = buf.getvalue()

    # Disassemble the bytecodes
    parsed_data = pickletools.dis(bytecodes)

    # Parse the disassembly into Python source code
    ast_code = ast.parse(parsed_data)

    # Print the generated source code
    import pprint
    pprint.pprint(ast_code)

# Example usage
class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(42)
generate_python_source_code(obj)

Explanation:

These examples demonstrate how to use pickletools for various purposes, from inspecting pickled data to generating Python source code that reconstructs it.

py_compile - Compile Python source files.md

py_compile - Compile Python source files

The py_compile module in Python's standard library provides a simple way to compile Python source files into bytecode using the built-in compiler. This is useful for distributing Python programs, as it allows you to distribute only the compiled bytecode instead of the source code. Below are several examples demonstrating various functionalities of the py_compile module.

Example 1: Compile a Single Source File

import py_compile

# Specify the source file and its output path (compiled bytecode)
source_file = 'example.py'
bytecode_file = 'example.pyc'

try:
    # Compile the source file into bytecode
    py_compile.compile(source_file, outdir=bytecode_file)
    print(f"Source file '{source_file}' compiled to '{bytecode_file}'.")
except FileNotFoundError:
    print(f"Error: Source file '{source_file}' not found.")
except Exception as e:
    print(f"An error occurred during compilation: {e}")

Example 2: Compile Multiple Source Files in a Directory

import py_compile
import os

# Specify the directory containing source files and the output directory for bytecode
src_dir = 'src'
bytecode_dir = 'build'

try:
    # Ensure the output directory exists
    if not os.path.exists(bytecode_dir):
        os.makedirs(bytecode_dir)

    # Compile all .py files in the source directory into bytecode
    for filename in os.listdir(src_dir):
        if filename.endswith('.py'):
            py_compile.compile(os.path.join(src_dir, filename), outdir=bytecode_dir)
            print(f"Compiled {filename} to {os.path.join(bytecode_dir, filename)}")
except FileNotFoundError:
    print("Error: Source directory not found.")
except Exception as e:
    print(f"An error occurred during compilation: {e}")

Example 3: Compile a Source File with Specific Options

import py_compile

# Specify the source file and its output path (compiled bytecode)
source_file = 'example.py'
bytecode_file = 'example.pyc'

try:
    # Compile the source file into bytecode with optimization enabled
    py_compile.compile(source_file, outdir=bytecode_dir, optimize=2)
    print(f"Source file '{source_file}' compiled to '{bytecode_file}' with optimization level 2.")
except FileNotFoundError:
    print("Error: Source file not found.")
except Exception as e:
    print(f"An error occurred during compilation: {e}")

Example 4: Check if a File is Already Compiled

import py_compile

# Specify the source and bytecode files
source_file = 'example.py'
bytecode_file = 'example.pyc'

if py_compile.is_compiled(source_file):
    print(f"{source_file} is already compiled to {bytecode_file}.")
else:
    print(f"{source_file} is not yet compiled.")

Example 5: Compile a Source File with Specific Mode

import py_compile

# Specify the source file and its output path (compiled bytecode)
source_file = 'example.py'
bytecode_file = 'example.pyc'

try:
    # Compile the source file into bytecode using the standard compiler mode
    py_compile.compile(source_file, outdir=bytecode_dir, modname='example')
    print(f"Source file '{source_file}' compiled to '{bytecode_dir}/__pycache__/example.cpython-312-py3-none-any.pyc' with module name 'example'.")
except FileNotFoundError:
    print("Error: Source file not found.")
except Exception as e:
    print(f"An error occurred during compilation: {e}")

These examples cover basic use cases for the py_compile module, including compiling a single source file, multiple files in a directory, specifying optimization levels, checking if a file is already compiled, and using a specific mode for compilation. Each example includes error handling to manage potential issues such as missing files or compilation errors.

pyclbr - Python class browser support.md

pyclbr - Python class browser support

The pyclbr module is a built-in Python module that provides a simple way to browse the directory of classes, functions, and methods defined by the Python compiler. It can be used to extract information about modules and objects within those modules.

Here are comprehensive code examples for the pyclbr module:

import pyclbr

# Load a module
module = pyclbr.readmodule('os')

# Print all classes in the loaded module
print("Classes in os:")
for cls in module.classes():
    print(f"  - {cls.name}")

# Print all functions in the loaded module
print("\nFunctions in os:")
for func in module.functions():
    print(f"  - {func.name}")

# Print details of a specific class
class_name = 'os.path'
if class_name in module.classes():
    cls_details = module.classes()[class_name]
    print(f"\nDetails of {class_name}:")
    for attr in cls_details.attributes:
        print(f"  - {attr.name} ({attr.type})")

# Print details of a specific function
function_name = 'os.path.join'
if function_name in module.functions():
    func_details = module.functions()[function_name]
    print(f"\nDetails of {function_name}:")
    for arg in func_details.arguments:
        print(f"  - {arg.name} ({arg.type})")

# Print all methods in a specific class
class_name = 'os.path'
if class_name in module.classes():
    cls_details = module.classes()[class_name]
    print("\nMethods in os.path:")
    for method in cls_details.methods:
        print(f"  - {method.name} ({method.type})")

Explanation:

  1. Loading a Module:
  2. pyclbr.readmodule('os') loads the contents of the os module and returns a dictionary-like object containing information about all classes, functions, and methods defined in the module.

  3. Printing All Classes:

  4. Iterates over the classes and prints their names.

  5. Printing All Functions:

  6. Iterates over the functions and prints their names.

  7. Details of a Specific Class:

  8. Checks if a specific class exists and retrieves its details.
  9. Prints all attributes, arguments, and methods for that class.

  10. Details of a Specific Function:

  11. Checks if a specific function exists and retrieves its details.
  12. Prints all arguments and their types for that function.

  13. Methods in a Specific Class:

  14. Retrieves the methods of a specific class and prints them.

These examples demonstrate how to use pyclbr to extract and display information about classes, functions, and methods within Python modules. The code is structured to be clear and easy to understand, making it suitable for inclusion in official documentation or educational purposes.

symtable - Access to the compiler s symbol tables.md

symtable - Access to the compilerโ€™s symbol tables

The symtable module in Python is designed to provide access to the symbol tables generated by the Python parser. These symbol tables are useful for introspection and can be used to understand the structure of a program's code at compile time. However, it's important to note that the symtable module is deprecated as of Python 3.8 and may not be supported in future versions. For most modern use cases, you should consider using other libraries or techniques for introspection.

Below are some examples of how you might interact with the symbol tables using the ast module, which provides a way to parse Python source code into an abstract syntax tree (AST). While symtable is not directly available for ASTs in Python 3.8 and later, it can be used indirectly by understanding the structure of AST nodes.

Example 1: Parsing Source Code

import ast

# Sample Python code
source_code = """
def example_function(a, b):
    return a + b
"""

# Parse the source code into an AST
tree = ast.parse(source_code)

# Print the type and name of each node in the AST
for node in tree:
    print(f"Node Type: {type(node).__name__}, Node Name: {node.__class__.__name__}")

Example 2: Extracting Function Names

import ast

def extract_function_names(source_code):
    tree = ast.parse(source_code)

    function_names = set()
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            function_names.add(node.name)

    return function_names

# Sample Python code
source_code = """
def example_function(a, b):
    return a + b

def another_example_function(c, d):
    e = c * d
"""

# Extract and print the function names
function_names = extract_function_names(source_code)
print("Function Names:", function_names)

Example 3: Inspecting Node Attributes

import ast

def inspect_node_attributes(source_code):
    tree = ast.parse(source_code)

    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            print(f"Function Name: {node.name}")
            print("Arguments:")
            for arg in node.args.args:
                print(f"  - {arg.arg}")
            print("Returns:", node.returns)

# Sample Python code
source_code = """
def example_function(a, b):
    return a + b

def another_example_function(c, d):
    e = c * d
"""

# Inspect attributes of function nodes
inspect_node_attributes(source_code)

Example 4: Extracting Variable Names

import ast

def extract_variable_names(source_code):
    tree = ast.parse(source_code)

    variable_names = set()
    for node in ast.walk(tree):
        if isinstance(node, (ast.Name, ast.Attribute)):
            variable_names.add(node.id)

    return variable_names

# Sample Python code
source_code = """
a = 10
b = a + 20
c = "hello"
d = c * 3
"""

# Extract and print the variable names
variable_names = extract_variable_names(source_code)
print("Variable Names:", variable_names)

Example 5: Inspecting Node Types

import ast

def inspect_node_types(source_code):
    tree = ast.parse(source_code)

    for node in ast.walk(tree):
        print(f"Node Type: {type(node).__name__}")

# Sample Python code
source_code = """
a = 10 + 20
b = "hello"
c = a + b
"""

# Inspect the types of nodes in the AST
inspect_node_types(source_code)

Example 6: Extracting Comments

import ast

def extract_comments(source_code):
    tree = ast.parse(source_code)

    comments = []
    for node in ast.walk(tree):
        if isinstance(node, ast.Expr) and isinstance(node.value, ast.Str):
            comments.append(node.value.s)

    return comments

# Sample Python code with comments
source_code = """
a = 10 + 20  # This is a comment
b = "hello"  # Another comment
c = a + b
"""

# Extract and print the comments
comments = extract_comments(source_code)
print("Comments:", comments)

These examples demonstrate how to parse and inspect Python source code using the ast module, which provides a powerful way to interact with the abstract syntax tree of Python programs. While the symtable module is deprecated, understanding ASTs can be a useful tool for introspection in Python programs.

tabnanny - Detection of ambiguous indentation.md

tabnanny - Detection of ambiguous indentation

The tabnanny module is used to detect and report on ambiguous indentation in Python scripts. Ambiguous indentation can lead to errors or unexpected behavior, so it's important to ensure consistent indentation in your code. Below are comprehensive examples demonstrating various functionalities of the tabnanny module.

1. Basic Usage

The simplest use case for tabnanny is to check a file for ambiguous indentation and report any issues.

import tabnanny

# Path to the Python script you want to check
file_path = 'example.py'

# Run the check on the specified file
problems = tabnanny.check(open(file_path))

if problems:
    print("Ambiguous indentation found:")
    for problem in problems:
        print(problem)
else:
    print("No ambiguous indentation issues found.")

2. Custom Indentation Check

You can specify a custom indentation size when checking the file.

import tabnanny

# Path to the Python script you want to check
file_path = 'example.py'

# Specify a custom indentation size (e.g., 4 spaces)
custom_indent_size = 4

# Run the check with a specified indentation size
problems = tabnanny.check(open(file_path), width=custom_indent_size)

if problems:
    print("Ambiguous indentation found:")
    for problem in problems:
        print(problem)
else:
    print("No ambiguous indentation issues found.")

3. Checking Multiple Files

You can check multiple files at once by providing a list of file paths.

import tabnanny

# List of Python script paths you want to check
file_paths = ['example1.py', 'example2.py']

# Run the check on the specified files
problems = tabnanny.check([open(file_path) for file_path in file_paths])

if problems:
    print("Ambiguous indentation found:")
    for problem in problems:
        print(problem)
else:
    print("No ambiguous indentation issues found.")

4. Skipping Lines

You can specify lines to skip during the check by providing a list of line numbers.

import tabnanny

# Path to the Python script you want to check
file_path = 'example.py'

# Specify lines to skip
lines_to_skip = [1, 5]  # Skip lines 1 and 5

# Run the check with specified lines to skip
problems = tabnanny.check(open(file_path), skip=[line - 1 for line in lines_to_skip])

if problems:
    print("Ambiguous indentation found:")
    for problem in problems:
        print(problem)
else:
    print("No ambiguous indentation issues found.")

5. Handling Output

You can handle the output of the check using a custom function.

import tabnanny

def print_problem(problem):
    print(f"Line: {problem.line}, Column: {problem.column}, Indent: {problem.indent}")

# Path to the Python script you want to check
file_path = 'example.py'

# Run the check and handle each problem using a custom function
problems = tabnanny.check(open(file_path), line_handler=print_problem)

if problems:
    print("Ambiguous indentation found.")
else:
    print("No ambiguous indentation issues found.")

6. Using tabnanny as a Command-Line Tool

You can use tabnanny as a command-line tool to check files directly.

# Run tabnanny on a file
python -m tabnanny example.py

# Check multiple files using a wildcard
python -m tabnanny *.py

7. Customizing the Output Format

You can customize the output format by providing a custom handler function.

import tabnanny

def print_custom(problem):
    print(f"Line: {problem.line}, Indent: {problem.indent}, Reason: {problem.reason}")

# Path to the Python script you want to check
file_path = 'example.py'

# Run the check with a custom line handler and format
problems = tabnanny.check(open(file_path), line_handler=print_custom, width=4)

if problems:
    print("Ambiguous indentation found:")
else:
    print("No ambiguous indentation issues found.")

These examples cover various scenarios for using tabnanny to detect and report on ambiguous indentation in Python scripts. By following these examples, you can effectively use tabnanny to maintain clean and consistent code indentation across your projects.

token - Constants used with Python parse trees.md

token - Constants used with Python parse trees

The token module in Python provides constants that are used to identify different types of tokens in a Python source code. These constants are part of the Abstract Syntax Tree (AST) and are used by tools like PEP 8 checkers, linters, and static code analysis tools to analyze Python code.

Here are comprehensive examples for each constant provided by the token module:

import token

# Define a simple Python expression as a string
source_code = "42 + 5"

# Tokenize the source code into tokens
tokens = []
for tok in tokenize.tokenize(io.BytesIO(source_code.encode('utf-8')).readline):
    # Append each token to the list with its type and value
    tokens.append((tok.type, tok.string))

# Print the list of tokens
print(tokens)

# Example: Extracting specific tokens from the list
integer_tokens = [t for t in tokens if t[0] == token.NUMBER]
print(integer_tokens)

Explanation:

  1. Import Token: The token module is imported to access the constants and functions related to tokens.

  2. Source Code: A simple Python expression is defined as a string.

  3. Tokenization: The tokenize.tokenize() function is used to tokenize the source code. It reads the source code line by line, converting it into a sequence of tokens.

  4. Collect Tokens: Each token is captured and stored in a list along with its type and value.

  5. Print Tokens: The list of tokens is printed, showing each token's type and string representation.

  6. Extract Specific Tokens: A list comprehension is used to extract all NUMBER tokens from the list, which represent integer literals in Python.

These examples demonstrate how to use the token module to process and analyze Python source code tokens.

tokenize - Tokenizer for Python source.md

tokenize - Tokenizer for Python source

The tokenize module in Python is used to break a Python source file into tokens, which are the smallest units of Python syntax. Below are comprehensive examples demonstrating various functionalities provided by the tokenize module.

Example 1: Basic Tokenization

import tokenize
from io import BytesIO

# Define a sample Python code as a byte string
code = b'print("Hello, World!")'

# Create a buffer from the byte string
buffer = BytesIO(code)

# Get an iterator over the tokens in the buffer
tokens = tokenize.tokenize(buffer.readline)

# Iterate and print each token
for toknum, tokval, start, end, line in tokens:
    print(f"Token: {toknum}, Value: '{tokval}', Start: {start}, End: {end}, Line: '{line}'")

Explanation:

Example 2: Handling Errors in Tokenization

import tokenize
from io import BytesIO

# Define a sample Python code with an error
code = b'print("Hello, World!'; # This is a syntax error'

# Create a buffer from the byte string
buffer = BytesIO(code)

# Get an iterator over the tokens in the buffer
tokens = tokenize.tokenize(buffer.readline)

try:
    for toknum, tokval, start, end, line in tokens:
        print(f"Token: {toknum}, Value: '{tokval}', Start: {start}, End: {end}, Line: '{line}'")
except tokenize.TokenError as e:
    print(f"Error encountered at tokenization: {e}")

Explanation:

Example 3: Extracting Tokens with Specific Names

import tokenize
from io import BytesIO

# Define a sample Python code with multiple tokens
code = b'x = y + z; print(x);'

# Create a buffer from the byte string
buffer = BytesIO(code)

# Get an iterator over the tokens in the buffer
tokens = tokenize.tokenize(buffer.readline)

# Extract and print only 'NAME' (variable names) and 'NUMBER' (numeric literals)
for toknum, tokval, start, end, line in tokens:
    if toknum in (tokenize.NAME, tokenize.NUMBER):
        print(f"Token: {toknum}, Value: '{tokval}', Start: {start}, End: {end}, Line: '{line}'")

Explanation:

Example 4: Tokenizing from a File

import tokenize
import os

# Define the path to a Python source file
file_path = 'example.py'

# Open and read the file
with open(file_path, 'rb') as file:
    code = file.read()

# Create a buffer from the file content
buffer = BytesIO(code)

# Get an iterator over the tokens in the buffer
tokens = tokenize.tokenize(buffer.readline)

# Iterate and print each token
for toknum, tokval, start, end, line in tokens:
    print(f"Token: {toknum}, Value: '{tokval}', Start: {start}, End: {end}, Line: '{line}'")

Explanation:

These examples demonstrate how to use the tokenize module effectively for various tasks such as analyzing Python code, debugging, or extracting specific information from source files.

Python Runtime Services

__future__ - Future statement definitions.md

future - Future statement definitions

The __future__ module in Python provides a way to specify features that are still experimental or may change in future versions of the language. These features can be enabled by using "future" statements at the top of your script or module. This module is part of Python's standard library, so it doesn't need to be installed separately.

Here are some examples of how you might use __future__ statements:

1. Using Generators with Expressions

In Python 3, generators can be used in expressions directly without parentheses. To enable this behavior in earlier versions of Python, you can use the from __future__ import generator_expr.

# Example using generator expressions before Python 3
even_numbers = (x for x in range(10) if x % 2 == 0)

# Using generator expression with future statement in Python 2
from __future__ import generator_expr

even_numbers = (x for x in range(10) if x % 2 == 0)

2. Unpacking Star Expressions

In Python 3, you can use the * operator directly to unpack iterables into positional arguments without parentheses. To enable this behavior in earlier versions of Python, you can use the from __future__ import star_args.

# Example using star expressions before Python 3
def print_numbers(*args):
    for num in args:
        print(num)

numbers = [1, 2, 3]
print_numbers(numbers)  # Output: 1 2 3

# Using star expressions with future statement in Python 2
from __future__ import star_args

def print_numbers(*args):
    for num in args:
        print(num)

numbers = [1, 2, 3]
print_numbers(*numbers)  # Output: 1 2 3

3. Division Behavior

In Python 3, the division of two integers results in a float. However, in earlier versions, it performed integer division and returned an integer result. To enable the behavior of returning a float, you can use the from __future__ import division.

# Example of integer division before Python 3
result = 5 / 2  # Output: 2

# Using division with future statement in Python 2
from __future__ import division

result = 5 / 2  # Output: 2.5

4. Print Function Syntax

In Python 3, the print function is a built-in function and does not require parentheses around its arguments. To enable this behavior in earlier versions of Python, you can use the from __future__ import print_function.

# Example using print function without parentheses before Python 3
print("Hello", "World")

# Using print function with future statement in Python 2
from __future__ import print_function

print("Hello", "World")

5. Float Division with //

In Python 3, the floor division of two integers returns an integer result. To enable this behavior in earlier versions of Python, you can use the from __future__ import floor_division.

# Example of floor division before Python 3
result = 5 // 2  # Output: 2

# Using floor division with future statement in Python 2
from __future__ import floor_division

result = 5 // 2  # Output: 2

These examples demonstrate how to use __future__ statements to leverage new features of Python without breaking compatibility with older versions. It's important to note that not all features are supported by the __future__ module, and some may require additional imports or configuration depending on your specific use case and environment.

__main__ - Top-level script environment.md

main - Top-level script environment

The __main__ module is a special module in Python that serves as the entry point for standalone scripts or when a script is executed from the command line. It allows you to define functions, classes, and variables that are not accessible by other modules.

Here's a comprehensive set of code examples demonstrating different functionalities within the __main__ module:

Example 1: Printing a Message

# Main script file, e.g., my_script.py

def main():
    """
    This function is the entry point for the script.
    It prints a welcome message when the script is run.
    """
    print("Welcome to my Python script!")

if __name__ == "__main__":
    # Check if this script is being run directly (not imported)
    main()

Example 2: Defining a Function with Command-Line Arguments

import sys

def sum_numbers(numbers):
    """
    This function takes a list of numbers as input and returns their sum.
    It uses command-line arguments for flexibility.
    """
    total = 0
    for number in numbers:
        total += int(number)
    return total

if __name__ == "__main__":
    # Check if this script is being run directly (not imported)
    if len(sys.argv) > 1:
        numbers = sys.argv[1:]
        result = sum_numbers(numbers)
        print(f"The sum of {numbers} is {result}.")
    else:
        print("Please provide a list of numbers as command-line arguments.")

Example 3: Handling Exceptions

def divide(a, b):
    """
    This function divides two numbers and handles exceptions.
    It returns the result or an error message if division by zero occurs.
    """
    try:
        return a / b
    except ZeroDivisionError:
        return "Error: Division by zero is not allowed."

if __name__ == "__main__":
    # Check if this script is being run directly (not imported)
    try:
        num1 = int(input("Enter the first number: "))
        num2 = int(input("Enter the second number: "))
        result = divide(num1, num2)
        print(f"The result of {num1} divided by {num2} is {result}.")
    except ValueError:
        print("Error: Please enter valid integers.")

Example 4: Using a Main Function

def add(a, b):
    """
    This function adds two numbers.
    It returns the sum of `a` and `b`.
    """
    return a + b

def subtract(a, b):
    """
    This function subtracts `b` from `a`.
    It returns the result of `a - b`.
    """
    return a - b

def multiply(a, b):
    """
    This function multiplies two numbers.
    It returns the product of `a` and `b`.
    """
    return a * b

def divide(a, b):
    """
    This function divides `a` by `b`.
    It returns the result of `a / b`.
    """
    try:
        return a / b
    except ZeroDivisionError:
        return "Error: Division by zero is not allowed."

if __name__ == "__main__":
    # Check if this script is being run directly (not imported)
    print("Options:")
    print("1. Add")
    print("2. Subtract")
    print("3. Multiply")
    print("4. Divide")

    choice = input("Enter your choice: ")
    num1 = float(input("Enter the first number: "))
    num2 = float(input("Enter the second number: "))

    if choice == '1':
        result = add(num1, num2)
    elif choice == '2':
        result = subtract(num1, num2)
    elif choice == '3':
        result = multiply(num1, num2)
    elif choice == '4':
        result = divide(num1, num2)
    else:
        print("Invalid choice.")
        exit()

    print(f"The result of {num1} {choice} {num2} is {result}.")

Example 5: Using if __name__ == "__main__": for Test Execution

def multiply(a, b):
    """
    This function multiplies two numbers.
    It returns the product of `a` and `b`.
    """
    return a * b

# Test cases to verify the correctness of the multiply function
def test_multiply():
    assert multiply(2, 3) == 6
    assert multiply(-1, 5) == -5
    assert multiply(0, 7) == 0
    assert multiply(4.5, 2) == 9.0

if __name__ == "__main__":
    # Check if this script is being run directly (not imported)
    test_multiply()
    print("All tests passed!")

Explanation:

These examples cover various aspects of using the __main__ module effectively, from basic structure to more complex interactions with command-line arguments and error handling.

abc - Abstract Base Classes.md

abc - Abstract Base Classes

The abc (Abstract Base Class) module in Python provides a way to define abstract base classes, which are classes that cannot be instantiated directly but serve as a blueprint for subclasses. This module includes the ABC class and decorators such as abstractmethod and abstractproperty. Below are comprehensive code examples demonstrating various functionalities of this module.

1. Defining an Abstract Base Class

from abc import ABC, abstractmethod

class Animal(ABC):
    # Constructor
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def speak(self):
        pass

# Attempting to instantiate the base class will raise a TypeError
try:
    animal = Animal("Generic Animal")  # This line will cause an error
except TypeError as e:
    print(e)  # Output: Can't instantiate abstract class Animal with abstract methods speak

2. Subclassing and Implementing Abstract Methods

from abc import ABC, abstractmethod

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)

    @abstractmethod
    def bark(self):
        pass

    def speak(self):
        return self.bark()

class Cat(Animal):
    def __init__(self, name):
        super().__init__(name)

    @abstractmethod
    def meow(self):
        pass

    def speak(self):
        return self.meow()

3. Abstract Properties

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def get_color(self):
        pass

    @property
    @abstractmethod
    def color(self):
        pass

    @color.setter
    @abstractmethod
    def color(self, value):
        pass

class Car(Vehicle):
    _color = None

    def __init__(self, make, model, color="red"):
        self.make = make
        self.model = model
        self.color = color

    def get_color(self):
        return self._color

    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, value):
        if isinstance(value, str) and value.lower() in ["red", "blue", "green"]:
            self._color = value.upper()
        else:
            raise ValueError("Invalid color. Choose from: red, blue, green")

4. Using ABCs with register to Customize Base Class

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def drive(self):
        pass

# Define a custom class that will be registered as a subclass of Vehicle
class Bike(Vehicle):
    def drive(self):
        return "Riding the bike"

# Register the custom class with the Vehicle ABC
Vehicle.register(Bike)

# Example usage
vehicle = Bike()
print(vehicle.drive())  # Output: Riding the bike

# Attempting to instantiate a non-registered subclass will raise an error
try:
    vehicle = Vehicle()  # This line will cause an error
except TypeError as e:
    print(e)  # Output: Can't instantiate abstract class Vehicle with abstract methods drive

5. Using abstractmethod on Class Methods and Static Methods

from abc import ABC, abstractmethod

class MathOperations(ABC):
    @staticmethod
    @abstractmethod
    def add(x, y):
        pass

    @classmethod
    @abstractmethod
    def multiply(cls, x, y):
        pass

class Calculator(MathOperations):
    @staticmethod
    def add(x, y):
        return x + y

    @classmethod
    def multiply(cls, x, y):
        return x * y

# Example usage
calc = Calculator()
print(calc.add(3, 5))       # Output: 8
print(calc.multiply(4, 6))   # Output: 24

6. Using abc with Inheritance and Multiple Abstract Methods

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * (self.width + self.height)

# Example usage
rectangle = Rectangle(5, 3)
print("Area:", rectangle.area())   # Output: Area: 15
print("Perimeter:", rectangle.perimeter()) # Output: Perimeter: 16

7. Using abc with Inheritance and Multiple Abstract Methods in a Subclass

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Mammal(Animal):
    def __init__(self, name):
        self.name = name

class Dog(Mammal):
    def speak(self):
        return "Woof!"

# Example usage
dog = Dog("Buddy")
print(dog.speak())  # Output: Woof!

8. Using abc with Inheritance and Multiple Abstract Methods in a Subclass with Class Attributes

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Rectangle(Shape):
    _width = None
    _height = None

    def __init__(self, width, height):
        self._width = width
        self._height = height

    def get_area(self):
        return self._width * self._height

# Example usage
rectangle = Rectangle(5, 3)
print("Area:", rectangle.get_area())   # Output: Area: 15

9. Using abc with Inheritance and Multiple Abstract Methods in a Subclass with Class Attributes and Properties

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Mammal(Animal):
    _name = None

    def __init__(self, name):
        self._name = name

class Dog(Mammal):
    def speak(self):
        return "Woof!"

# Example usage
dog = Dog("Buddy")
print(dog.speak())  # Output: Woof!

10. Using abc with Inheritance and Multiple Abstract Methods in a Subclass with Class Attributes and Properties

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Mammal(Animal):
    _name = None

    def __init__(self, name):
        self._name = name

class Dog(Mammal):
    def speak(self):
        return "Woof!"

# Example usage
dog = Dog("Buddy")
print(dog.speak())  # Output: Woof!

These examples demonstrate various aspects of using the abc module in Python, including defining abstract base classes, subclassing, implementing methods and properties, and using register to customize base classes. Each example includes comments explaining each step for clarity.

atexit - Exit handlers.md

atexit - Exit handlers

The atexit module in Python provides a way to register functions that will be called when normal program termination occurs, typically upon exit. This is useful for cleanup tasks such as closing files or releasing resources.

Below are comprehensive code examples demonstrating various functionalities of the atexit module:

1. Basic Usage

The simplest use case involves registering a function to be called on program exit.

import atexit

def cleanup_function():
    print("Cleanup function executed")

# Register the cleanup function
atexit.register(cleanup_function)

# Simulate program termination (e.g., by reaching the end of the script)
print("Program is about to terminate")

2. Multiple Handlers

You can register multiple functions that will be called in reverse order of registration.

import atexit

def first_cleanup():
    print("First cleanup function executed")

def second_cleanup():
    print("Second cleanup function executed")

# Register multiple cleanup functions
atexit.register(first_cleanup)
atexit.register(second_cleanup)

# Simulate program termination
print("Program is about to terminate")

3. Handling Exceptions

If one of the cleanup functions raises an exception, it will be caught by Python's default exception handling mechanism.

import atexit

def first_cleanup():
    print("First cleanup function executed")

def second_cleanup():
    raise Exception("Error in second cleanup")

# Register multiple cleanup functions
atexit.register(first_cleanup)
atexit.register(second_cleanup)

try:
    # Simulate program termination with an error
    print("Program is about to terminate")
except Exception as e:
    print(f"An error occurred: {e}")

4. Cleanup on Module Exit

You can use atexit in modules to ensure cleanup code runs when the module is unloaded.

import atexit

def my_module_cleanup():
    print("Module cleanup function executed")

# Register a cleanup function for this module
atexit.register(my_module_cleanup)

def my_module_function():
    # Module-specific logic here
    print("Module function is running")

# Use the module
my_module_function()

5. Using atexit with Subprocesses

When working with subprocesses, you might want to ensure that cleanup actions are performed on both the parent and child processes.

import atexit
import os
import sys
import subprocess

def parent_cleanup():
    print("Parent cleanup function executed")

def child_cleanup():
    print("Child cleanup function executed")

# Register cleanup functions for the parent and child processes
atexit.register(parent_cleanup)
atexit.register(child_cleanup)

# Create a new process
pid = os.fork()

if pid == 0:
    # This is the child process
    sys.exit(0)  # Terminate the child process
else:
    # This is the parent process
    print("Parent process is running")

6. Using atexit with Signals

You can use signals to trigger cleanup actions, such as when a program receives a termination signal.

import atexit
import os
import signal

def cleanup_function():
    print("Cleanup function executed")

# Register the cleanup function
atexit.register(cleanup_function)

# Set up a signal handler for SIGTERM (kill -SIGTERM)
signal.signal(signal.SIGTERM, lambda signum, frame: cleanup_function())

print("Program is running and can be terminated with Ctrl+C")
try:
    while True:
        # Simulate long-running task
        pass
except KeyboardInterrupt:
    print("Termination signal received")

7. Using atexit with Threads

When using threads, you might want to ensure that cleanup actions are performed when all threads complete.

import atexit
import threading
import time

def thread_cleanup():
    print("Thread cleanup function executed")

# Register the cleanup function
atexit.register(thread_cleanup)

def worker_thread(name):
    print(f"Thread {name} is running")
    time.sleep(2)
    print(f"Thread {name} is completed")

# Create and start multiple threads
threads = []
for i in range(3):
    thread = threading.Thread(target=worker_thread, args=(i,))
    threads.append(thread)
    thread.start()

# Wait for all threads to complete
for thread in threads:
    thread.join()

print("All threads have completed")

8. Using atexit with Resource Management

You can use atexit to ensure that resources are properly released when the program terminates.

import atexit
import tempfile

def cleanup_file():
    # Clean up any temporary files created by this module
    for filename in os.listdir(tempfile.gettempdir()):
        if filename.startswith("my_module_temp_"):
            os.remove(os.path.join(tempfile.gettempdir(), filename))

# Register the cleanup function
atexit.register(cleanup_file)

def my_module_function():
    # Create a temporary file
    with tempfile.NamedTemporaryFile(delete=False) as temp:
        print(f"Created temporary file: {temp.name}")

my_module_function()
print("Program is running")

These examples demonstrate various use cases for the atexit module, including basic cleanup, handling exceptions, and using atexit within modules and threads. By following these examples, you can effectively manage resources and ensure that your program performs necessary cleanup actions before termination.

builtins - Built-in objects.md

builtins - Built-in objects

The builtins module in Python is a special module that contains all the built-in names available in every interactive session and in all modules. It provides access to the most commonly used functions, types, and exceptions.

Here are some comprehensive code examples for each functionality in the builtins module:

1. Accessing Built-in Functions

# Example: Using abs() function
number = -42
absolute_value = abs(number)
print(f"The absolute value of {number} is {absolute_value}")

# Example: Using max() function
list_of_numbers = [3, 5, 7, 1, 9]
maximum_number = max(list_of_numbers)
print(f"The maximum number in the list is {maximum_number}")

# Example: Using min() function
minimum_number = min(list_of_numbers)
print(f"The minimum number in the list is {minimum_number}")

2. Accessing Built-in Types

# Example: Creating a list
my_list = [1, 2, 3, 4, 5]
print("List:", my_list)

# Example: Creating a tuple
my_tuple = (10, 20, 30)
print("Tuple:", my_tuple)

# Example: Creating a dictionary
my_dict = {'name': 'Alice', 'age': 30}
print("Dictionary:", my_dict)

3. Accessing Built-in Exceptions

# Example: Using ValueError exception to catch invalid input
try:
    value = int('abc')
except ValueError as e:
    print(f"ValueError caught: {e}")

# Example: Using FileNotFoundError exception to handle missing files
try:
    with open('nonexistent_file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError caught: {e}")

4. Accessing Built-in Constants

# Example: Using True, False, and None constants
print("True:", True)
print("False:", False)
print("None:", None)

# Example: Accessing the maximum value an int can hold in Python
max_int = sys.maxsize
print(f"The maximum value an int can hold is {max_int}")

# Example: Using pi from math module (accessed through builtins)
import math
pi_value = math.pi
print(f"Value of pi: {pi_value}")

5. Accessing Built-in Modules

# Example: Importing the math module
import math

# Using a function from the math module
result = math.sqrt(25)
print(f"The square root of 25 is {result}")

# Accessing an attribute from the math module
e_value = math.e
print(f"Value of e (Euler's number): {e_value}")

6. Accessing Built-in Classes

# Example: Using the complex class to create a complex number
complex_number = complex(3, 4)
print("Complex Number:", complex_number)

# Example: Using the list class to create a mutable list
mutable_list = [1, 2, 3]
print("Mutable List:", mutable_list)

# Accessing an attribute from a class in builtins
list_len = len(mutable_list)
print(f"Length of the list: {list_len}")

7. Accessing Built-in Methods

# Example: Using the upper() method on a string
text = "hello"
uppercase_text = text.upper()
print(f"Uppercase text: '{uppercase_text}'")

# Example: Using the append() method on a list
mutable_list.append(6)
print("Updated List:", mutable_list)

# Accessing an attribute of a class instance in builtins
list_count = len(mutable_list)
print(f"Length of the list after appending: {list_count}")

8. Accessing Built-in Modules and Functions

# Example: Using the time module to get current time
import time

current_time = time.localtime()
print("Current Time:", current_time)

# Example: Using the random module to generate a random number
import random

random_number = random.randint(1, 10)
print(f"Random Number between 1 and 10: {random_number}")

9. Accessing Built-in Constants and Functions

# Example: Using the math constants pi and e
import math

pi_value = math.pi
e_value = math.e

print(f"Value of pi: {pi_value}")
print(f"Value of e (Euler's number): {e_value}")

# Example: Using the math functions sin() and cos()
sin_value = math.sin(math.pi / 2)
cos_value = math.cos(0)

print(f"Sine of pi/2: {sin_value}")
print(f"Cosine of 0: {cos_value}")

10. Accessing Built-in Operators

# Example: Using the addition operator (+) with numbers
num1 = 5
num2 = 3
sum_result = num1 + num2
print(f"Sum of {num1} and {num2} is {sum_result}")

# Example: Using the multiplication operator (*) with strings
string1 = "Hello"
string2 = "World"
product_string = string1 * 3
print(f"Product of '{string1}' repeated 3 times: '{product_string}'")

These examples demonstrate various aspects of using the builtins module, including accessing built-in functions, types, exceptions, constants, modules, classes, methods, and operators. Each example is clear, concise, and includes comments to explain each step.

code - Interpreter base classes.md

code - Interpreter base classes

The code module is part of Python's standard library and provides a way to define and execute code objects, which can be useful for implementing dynamic language interpreters or other features that require executing arbitrary code. This module does not contain any public functions; instead, it defines a base class for classes representing code objects.

Here are some examples demonstrating how you might use the code module internally, assuming you want to create your own interpreter:

Example 1: Creating a Custom Code Object

First, let's define a custom code object that can be executed. This is done by subclassing types.CodeType.

import types

class CustomCodeObject:
    def __init__(self, co_name, co_code, co_filename, co_firstlineno, co_globals):
        self.co_name = co_name
        self.co_code = co_code
        self.co_filename = co_filename
        self.co_firstlineno = co_firstlineno
        self.co_globals = co_globals

    def __repr__(self):
        return f"CustomCodeObject(name={self.co_name}, filename={self.co_filename})"

# Example usage
code_obj = CustomCodeObject(
    "my_function",
    b"\x03\x41\x00\x00\x00",  # Bytecode for a simple print statement: 'print("Hello, World!")'
    "__main__.py",
    1,
    {"print": print}
)

Example 2: Executing a Custom Code Object

Next, we can execute this custom code object using the exec function.

def execute_custom_code(code_obj):
    # Convert the bytecode to a string representation for execution
    byte_string = bytes.fromhex(code_obj.co_code.decode('latin1'))

    # Execute the code
    exec(byte_string, code_obj.co_globals)

# Example usage
execute_custom_code(code_obj)

Example 3: Creating and Executing Code Objects from Strings

You can also create a CodeType object directly from strings.

import types

def create_and_execute_code_from_strings(
    name,
    source_code,
    filename="__main__.py",
    firstlineno=1,
    globals={}
):
    # Compile the source code into bytecode
    byte_code = compile(source_code, filename, 'exec')

    # Create a CodeType object
    co_type = types.CodeType(
        len(byte_code.co_names),  # Number of local variables
        len(byte_code.co_varnames),  # Number of global variables
        len(byte_code.co_consts),   # Number of constants
        len(byte_code.co_cellvars),  # Number of cell variables
        len(byte_code.co_freevars),  # Number of free variables
        byte_code.co_flags,         # Flags for the code object
        byte_code.co_code,           # Bytecode
        byte_code.co_consts,           # Constant pool
        byte_code.co_names,          # Local variable names
        byte_code.co_varnames,        # Global variable names
        filename,
        firstlineno
    )

    # Create a custom code object from the CodeType
    code_obj = CustomCodeObject(
        name,
        co_type.co_code.decode('latin1'),
        filename,
        firstlineno,
        globals
    )

    return code_obj

# Example usage
code_string = """
print("Hello, World!")
"""
code_obj = create_and_execute_code_from_strings(
    "my_function",
    code_string
)

Explanation

These examples demonstrate how you can use the code module to define and execute arbitrary code objects in Python. Note that executing untrusted code can be dangerous and should only be done with caution, especially in environments where security is critical.

codeop - Compile Python code.md

codeop - Compile Python code

The codeop module in Python provides tools to compile Python source code into bytecode. It's particularly useful for situations where you need to dynamically execute or modify Python code at runtime, such as in interactive shells, interpreters, or during the execution of custom scripts.

Below are some comprehensive examples that demonstrate various functionalities provided by the codeop module:

Example 1: Basic Compilation and Execution

import codeop

# Define a Python source code string
source_code = """
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")
"""

# Compile the source code into bytecode using codeop.compile_command
code_ast = codeop.compile_command(source_code)

# Execute the compiled bytecode to call the function and display output
result = eval(code_ast)
print(result)  # Output: Hello, Alice!

Example 2: Compiling Source Code with Specific Mode

import codeop

# Define a Python source code string
source_code = """
def add(x, y):
    return x + y
"""

# Compile the source code into bytecode using a specific mode (e.g., 'exec')
code_ast = codeop.compile_command(source_code, mode='exec')

# Execute the compiled bytecode to define the function
eval(code_ast)

# Call the function and display output
result = add(3, 5)
print(result)  # Output: 8

Example 3: Compiling Source Code into Bytecode Without Executing

import codeop

# Define a Python source code string
source_code = """
def multiply(x, y):
    return x * y
"""

# Compile the source code into bytecode using codeop.compile_command
code_ast = codeop.compile_command(source_code)

# The result is a syntax tree (AST) node, not executable bytecode
print(code_ast)

Example 4: Handling Syntax Errors Gracefully

import codeop

# Define a Python source code string with an error
source_code_with_error = """
def divide(x, y):
    return x / y
"""

try:
    # Compile the source code into bytecode
    code_ast = codeop.compile_command(source_code_with_error)
except SyntaxError as e:
    print(f"Compilation error: {e}")

Example 5: Compiling and Executing Dynamically

import codeop

# Define a function to compile and execute Python source code dynamically
def run_python_code(code):
    try:
        # Compile the source code into bytecode
        code_ast = codeop.compile_command(code)

        # Execute the compiled bytecode to call the function or execute statements
        result = eval(code_ast)
        return result
    except SyntaxError as e:
        print(f"Compilation error: {e}")
        return None

# Example usage of the run_python_code function
code_to_run = """
def square(x):
    return x * x

result = square(4)
print(result)  # Output: 16
"""
output = run_python_code(code_to_run)
print(output)  # Output: 16

Example 6: Using compile_command with Specific Mode and Flags

import codeop

# Define a Python source code string
source_code = """
x = 10
y = 20
"""

# Compile the source code into bytecode using a specific mode ('exec') and flags (optimize)
code_ast = codeop.compile_command(source_code, mode='exec', flags=codeop.OPTIMIZE)

# Execute the compiled bytecode to define variables
eval(code_ast)

# Access and print variables from the compiled environment
print(x)  # Output: 10
print(y)  # Output: 20

Example 7: Using compile_command with Input File

import codeop

# Define a file path containing Python source code
file_path = 'example.py'

# Compile the content of the file into bytecode using codeop.compile_file
with open(file_path, 'r') as file:
    file_content = file.read()
    code_ast = codeop.compile_file(file_content)

# Execute the compiled bytecode from the file
eval(code_ast)

These examples cover a range of use cases for the codeop module, including basic compilation and execution, handling syntax errors gracefully, dynamically compiling and executing Python code, and using the module with specific modes and flags. The examples are designed to be clear, concise, and suitable for inclusion in official documentation.

contextlib - Utilities for with-statement contexts.md

contextlib - Utilities for with-statement contexts

The contextlib module in Python provides utilities for managing resources, especially those that need to be set up before a block of code is executed and cleaned up afterward. It offers several classes and functions designed to simplify common tasks like handling temporary files, database connections, and more. Below are comprehensive examples of how to use each of the main classes and functions in the contextlib module.

1. Context Managers

Context managers allow you to define a block of code that should be executed within a specific context, such as opening and closing a file, connecting to a database, or ensuring resources are freed correctly.

Example 1: Using with Statement with open()

import contextlib

# Use the 'with' statement to manage file operations
with open('example.txt', 'w') as f:
    # Write some text to the file
    f.write("Hello, context manager!")

Explanation:

2. contextlib.nested()

The nested() function allows multiple context managers to be used simultaneously within a single block.

Example 2: Using nested() with open() and sqlite3.connect()

import contextlib
import sqlite3

# Use nested contexts for multiple operations
with contextlib.nested(open('example.txt', 'w'), sqlite3.connect(':memory:')) as (f, conn):
    f.write("Hello from file and database!")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE example_table (id INTEGER PRIMARY KEY, value TEXT)")
    cursor.execute("INSERT INTO example_table (value) VALUES ('Test')")

Explanation:

3. contextlib.ExitStack

ExitStack allows multiple contexts to be pushed onto it, which are then closed in the order they were pushed. This is useful for managing resources that need to be cleaned up in a specific order.

Example 3: Using ExitStack with open() and closing them in reverse order

import contextlib
import sqlite3

# Use ExitStack for managing multiple resources
with contextlib.ExitStack() as stack:
    f = stack.enter_context(open('example.txt', 'w'))
    conn = stack.enter_context(sqlite3.connect(':memory:'))

    # File and database operations
    f.write("Hello from file and database!")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE example_table (id INTEGER PRIMARY KEY, value TEXT)")
    cursor.execute("INSERT INTO example_table (value) VALUES ('Test')")

    # Close resources in reverse order
    stack.pop_all()

Explanation:

4. contextlib.suppress()

suppress() is used to suppress specific exceptions during execution. This is particularly useful when you want to ignore certain errors without changing the code's flow.

Example 4: Using suppress() with os.remove()

import contextlib
import os

# Use suppress to handle missing file exception
with contextlib.suppress(FileNotFoundError):
    os.remove('nonexistent_file.txt')

Explanation:

5. contextlib.redirect_stdout

redirect_stdout redirects the standard output of a block of code to a specified stream, allowing you to capture and manipulate it easily.

Example 5: Using redirect_stdout to capture console output

import contextlib
import sys

# Use redirect_stdout to capture console output
with contextlib.redirect_stdout(sys.stderr):
    print("This will be printed to stderr")

with contextlib.redirect_stdout(open('output.txt', 'w')):
    print("This will be written to file output.txt")

Explanation:

6. contextlib.redirect_stderr

Similar to redirect_stdout, redirect_stderr redirects the standard error of a block of code to a specified stream, allowing you to capture and manipulate it easily.

Example 6: Using redirect_stderr to capture console error

import contextlib
import sys

# Use redirect_stderr to capture console error
with contextlib.redirect_stderr(sys.stdout):
    print("This will be printed to stdout")

with contextlib.redirect_stderr(open('error.txt', 'w')):
    print("This will be written to file error.txt")

Explanation:

7. contextlib.redirect_stdout

A simple example of using redirect_stdout to capture console output from a function.

import contextlib
import sys

def my_function():
    print("This is the output")

# Capture console output using redirect_stdout
with contextlib.redirect_stdout(sys.stderr):
    my_function()

Explanation:

8. contextlib.suppress()

A simple example of using suppress() to handle exceptions within a function.

import contextlib

def risky_function():
    try:
        1 / 0
    except ZeroDivisionError as e:
        print(f"Caught an error: {e}")

# Suppressing division by zero exception
with contextlib.suppress(ZeroDivisionError):
    risky_function()

Explanation:

9. contextlib.suppress()

A simple example of using suppress() to handle exceptions within a function and logging them.

import contextlib
import logging

def risky_function():
    try:
        1 / 0
    except Exception as e:
        logging.error(f"Caught an error: {e}")

# Suppressing all exceptions and logging errors
with contextlib.suppress(Exception):
    risky_function()

Explanation:

10. contextlib.suppress()

A simple example of using suppress() to handle multiple specific exceptions within a function.

import contextlib

def risky_function():
    try:
        1 / 0
    except ZeroDivisionError as e:
        print(f"Caught an error: {e}")
    except TypeError as e:
        print(f"Caught another error: {e}")

# Suppressing specific exceptions
with contextlib.suppress(ZeroDivisionError, TypeError):
    risky_function()

Explanation:

These examples demonstrate how to use various features provided by the contextlib module to manage resources, capture and handle output and errors, and simplify the management of context in Python.

dataclasses - Data Classes.md

dataclasses - Data Classes

Data classes in Python provide a convenient way to create classes with default values, immutable attributes, and automatically generated special methods like __init__, __repr__, __eq__, etc. They are particularly useful for creating classes that represent complex data structures.

Here is a comprehensive guide with code examples for various functionalities of the dataclasses module in Python 3.12:

Installation

Data classes are part of Python's standard library starting from version 3.7, so no installation is necessary. However, if you're using an older version of Python, ensure you have it installed.

Example 1: Basic Usage

from dataclasses import dataclass

# Define a simple data class with default values
@dataclass
class Point:
    x: int = 0
    y: int = 0

# Create an instance of the Point class
p = Point(3, 4)

# Print the object representation
print(p)  # Output: Point(x=3, y=4)

# Accessing attributes
print(p.x)  # Output: 3
print(p.y)  # Output: 4

# Modify an attribute and print again
p.x = 5
print(p)  # Output: Point(x=5, y=4)

Example 2: Multiple Default Values

from dataclasses import dataclass

# Define a data class with multiple default values
@dataclass
class Circle:
    radius: float = 1.0
    color: str = "red"

# Create an instance of the Circle class
c = Circle()

# Print the object representation
print(c)  # Output: Circle(radius=1.0, color='red')

# Modify attributes and print again
c.radius = 2.5
c.color = "blue"
print(c)  # Output: Circle(radius=2.5, color='blue')

Example 3: Immutable Attributes

from dataclasses import dataclass

# Define a data class with an immutable attribute
@dataclass(frozen=True)
class PointImmutable:
    x: int = 0
    y: int = 0

# Create an instance of the PointImmutable class
p_immutable = PointImmutable(3, 4)

# Attempt to modify an immutable attribute (will raise an error)
try:
    p_immutable.x = 5
except AttributeError as e:
    print(e)  # Output: can't set attribute

Example 4: Custom Initialization

from dataclasses import dataclass

# Define a data class with custom initialization logic
@dataclass
class Person:
    name: str
    age: int

    def __post_init__(self):
        self.full_name = f"{self.name} {self.age}"

# Create an instance of the Person class
p_person = Person("John", 30)

# Print the object representation and the custom attribute
print(p_person)  # Output: Person(name='John', age=30)
print(p_person.full_name)  # Output: John 30

Example 5: Auto-Generated Special Methods

from dataclasses import dataclass

# Define a data class with auto-generated special methods
@dataclass
class Employee:
    name: str
    position: str
    salary: float = 0.0

    def __post_init__(self):
        self.full_name = f"{self.name} ({self.position})"

# Create an instance of the Employee class
e_employee = Employee("Alice", "Developer")

# Print the object representation and the custom attribute
print(e_employee)  # Output: Employee(name='Alice', position='Developer')
print(e_employee.full_name)  # Output: Alice (Developer)

Example 6: Optional Attributes

from dataclasses import dataclass, field

# Define a data class with optional attributes using the `field` function
@dataclass
class Book:
    title: str = field(default="Unknown Title")
    author: str
    year: int = None

# Create an instance of the Book class without specifying optional attributes
b_book = Book("Python Programming")

# Print the object representation and default values for optional attributes
print(b_book)  # Output: Book(title='Python Programming', author=None, year=None)

Example 7: Recursive Data Classes

from dataclasses import dataclass

# Define a recursive data class to represent a tree structure
@dataclass
class TreeNode:
    value: int
    left: 'TreeNode' = None
    right: 'TreeNode' = None

# Create an instance of the TreeNode class as a simple binary search tree
tree = TreeNode(10, TreeNode(5), TreeNode(15))

# Print the object representation and structure
print(tree)  # Output: TreeNode(value=10, left=TreeNode(value=5, left=None, right=None), right=TreeNode(value=15, left=None, right=None))

Example 8: Custom Class Methods

from dataclasses import dataclass

# Define a data class with custom class methods
@dataclass
class Triangle:
    side_a: float
    side_b: float
    side_c: float

    @property
    def is_equilateral(self) -> bool:
        return self.side_a == self.side_b and self.side_b == self.side_c

# Create an instance of the Triangle class
t_triangle = Triangle(3, 3, 3)

# Check if the triangle is equilateral
print(t_triangle.is_equilateral)  # Output: True

Example 9: Custom Class Variables

from dataclasses import dataclass

# Define a data class with custom class variables
@dataclass
class Account:
    balance: float = 0.0

    @classmethod
    def create_new_account(cls, initial_deposit: float) -> 'Account':
        account = cls(initial_deposit)
        return account

# Create a new instance of the Account class using the class method
a_account = Account.create_new_account(100.0)

# Print the object representation and balance
print(a_account)  # Output: Account(balance=100.0)

Example 10: Handling Nested Data Classes

from dataclasses import dataclass

# Define nested data classes to represent a tree structure
@dataclass
class TreeNode:
    value: int
    children: list['TreeNode'] = field(default_factory=list)

# Create an instance of the TreeNode class as a simple binary search tree with nested nodes
tree_nested = TreeNode(10, [TreeNode(5), TreeNode(15)])

# Print the object representation and structure
print(tree_nested)  # Output: TreeNode(value=10, children=[TreeNode(value=5, children=[]), TreeNode(value=15, children=[])])

Example 11: Data Classes with from __future__ import annotations

from dataclasses import dataclass
from typing import Union

# Define a data class that uses type hints with `Union` and `from __future__ import annotations`
@dataclass
class Shape:
    shape_type: str = "unknown"
    size: Union[int, float] = 0.0

# Create an instance of the Shape class using type hints
s_shape = Shape(shape_type="circle", size=3.14)

# Print the object representation and attributes
print(s_shape)  # Output: Shape(shape_type='circle', size=3.14)

Example 12: Using dataclasses.asdict for Serialization

from dataclasses import dataclass, asdict

# Define a data class with default values
@dataclass
class Person:
    name: str = "John"
    age: int = 30

# Create an instance of the Person class
p_person = Person()

# Convert the data class to a dictionary using `asdict`
person_dict = asdict(p_person)

# Print the resulting dictionary
print(person_dict)  # Output: {'name': 'John', 'age': 30}

Example 13: Using dataclasses.astuple for Serialization

from dataclasses import dataclass, astuple

# Define a simple data class with default values
@dataclass
class Point:
    x: int = 0
    y: int = 0

# Create an instance of the Point class
p_point = Point(3, 4)

# Convert the data class to a tuple using `astuple`
point_tuple = astuple(p_point)

# Print the resulting tuple
print(point_tuple)  # Output: (3, 4)

Example 14: Using dataclasses.replace for Object Modification

from dataclasses import dataclass, replace

# Define a simple data class with default values
@dataclass
class Person:
    name: str = "John"
    age: int = 30

# Create an instance of the Person class
p_person = Person(name="Alice", age=25)

# Modify the object using `replace`
new_person = replace(p_person, name="Bob")

# Print the modified object
print(new_person)  # Output: Person(name='Bob', age=30)

These examples demonstrate various use cases and features of Python's dataclasses module, including default values, class methods, custom variables, nested data classes, type hints, serialization, and object modification. Each example provides a practical application of the module to handle complex data structures efficiently.

gc - Garbage Collector interface.md

gc - Garbage Collector interface

The gc module in Python is used to control garbage collection runtime behavior. It provides a way to enable or disable automatic garbage collection, tune the collector's parameters, and collect garbage manually.

Here are comprehensive code examples that cover various functionalities of the gc module:

import gc

# Enable automatic garbage collection (default state)
print("Automatic garbage collection is currently enabled:", gc.isenabled())

# Disable automatic garbage collection
gc.disable()
print("Automatic garbage collection is now disabled:", gc.isenabled())

# Re-enable automatic garbage collection
gc.enable()
print("Automatic garbage collection is now enabled:", gc.isenabled())

# Set the garbage collector's threshold to 100 objects
gc.set_threshold(100)
print("Garbage collection threshold set to:", gc.get_threshold())

# Print the current state of the garbage collector
print("Garbage collection status:", gc.garbage)

# Collect all uncollectable objects immediately
gc.collect()
print("Garbage collected:", len(gc.garbage))

# Set the debug level for garbage collection (0 is no debugging, higher numbers increase verbosity)
gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)
print("Garbage collection debug set to:", gc.get_debug())

# Print garbage collection statistics
print("Garbage collection statistics:")
for line in gc.garbage_stats():
    print(line)

# Print the maximum memory usage of the Python interpreter
print("Maximum memory usage (bytes):", gc.mem_get_usage())

Explanation:

  1. Enable and Disable Automatic Garbage Collection:
  2. gc.isenabled(): Checks if automatic garbage collection is enabled.
  3. gc.disable(): Disables automatic garbage collection.
  4. gc.enable(): Re-enables automatic garbage collection.

  5. Set Garbage Collector Threshold:

  6. gc.set_threshold(n): Sets the threshold number of uncollectable objects before a collection occurs.

  7. Check Current State of Garbage Collection:

  8. gc.garbage: A list of all objects that are not reachable from any reference, but have not yet been collected by garbage collection.

  9. Perform Garbage Collection:

  10. gc.collect(): Initiates a garbage collection cycle and returns the number of unreachable objects collected.

  11. Set Garbage Collection Debug Level:

  12. gc.set_debug(flag): Sets the debugging flags for the garbage collector.
  13. gc.get_debug(): Returns the current debugging level.

  14. Print Garbage Collection Statistics:

  15. gc.garbage_stats(): Provides statistics about garbage collection activities, such as number of collections and time spent.

  16. Check Memory Usage:

  17. gc.mem_get_usage(): Returns an estimate of the maximum memory usage of the Python interpreter.

These examples demonstrate how to manage and monitor garbage collection in a Python application, which is crucial for optimizing performance and handling memory efficiently.

inspect - Inspect live objects.md

inspect - Inspect live objects

The inspect module in Python provides several functions to access information about live objects such as modules, classes, methods, and frames. Below are comprehensive examples demonstrating various functionalities of the inspect module:

import inspect

# Example 1: Get the source code of a function
def example_function(x):
    """A simple function for demonstration."""
    return x * 2

source_code = inspect.getsource(example_function)
print("Source code of example_function:")
print(source_code)

# Example 2: Check if an object is a class
class MyClass:
    pass

is_class = inspect.isclass(MyClass)
print(f"Is MyClass a class? {is_class}")

# Example 3: Get the docstring of a function
docstring = inspect.getdoc(example_function)
print("Docstring of example_function:")
print(docstring)

# Example 4: Get the argument specification of a function
argspec = inspect.signature(example_function)
print("Argument specification of example_function:")
for param in argspec.parameters.values():
    print(f"Parameter name: {param.name}, Default value: {param.default}")

# Example 5: Get the module containing a class or function
module_name = inspect.getmodule(MyClass).__name__
print(f"The module containing MyClass is: {module_name}")

# Example 6: List all functions and classes in a module
import math

for name, obj in inspect.getmembers(math):
    if inspect.isfunction(obj) or inspect.isclass(obj):
        print(name)

# Example 7: Get the current stack frame information
frame = inspect.currentframe()
print("Current stack frame details:")
print(frame.f_code.co_filename)
print(frame.f_lineno)
print(frame.f_locals)

# Example 8: Get all local variables in the current stack frame
locals_vars = frame.f_locals.copy()  # Create a copy of the dictionary
print("Local variables in the current stack frame:")
for key, value in locals_vars.items():
    print(f"{key}: {value}")

# Example 9: Trace execution of a function using inspect.getsource and eval
def trace_function(func):
    source = inspect.getsource(func)
    # Replace 'func' with its source code to simulate execution
    exec(source)

trace_function(example_function)

# Example 10: Get the file path where an object was defined
file_path = inspect.getmodule(example_function).__file__
print(f"The file path of example_function is: {file_path}")

# Example 11: Check if an object is a frame
is_frame = inspect.isframe(inspect.currentframe())
print(f"Is current frame? {is_frame}")

Explanation:

These examples cover various aspects of inspecting live objects in Python, providing a comprehensive overview of its capabilities.

site - Site-specific configuration hook.md

site - Site-specific configuration hook

The site module in Python is used to customize the behavior of Python's import system, especially when it comes to loading modules from a directory outside the standard installation path. This can be useful for various purposes, such as extending the Python environment with additional libraries or modules.

Here are comprehensive code examples for each functionality provided by the site module:

1. site.addsitedir(path)

import site

# Add a custom site directory to the Python path
site.addsitedir('/path/to/custom/site-packages')

# Now, you can import modules from this directory
try:
    import my_custom_module
except ImportError as e:
    print(f"Module not found: {e}")

2. site.getsitepackages()

import site

# Get the list of site-packages directories
site_packages_directories = site.getsitepackages()

print("Site-packages directories:", site_packages_directories)

3. site.getusersitepackages()

import site

# Get the path to the user's site-packages directory
user_site_packages = site.getusersitepackages()

print("User site-packages directory:", user_site_packages)

4. site.getsitecustomize()

import site

# Get the path to the sitecustomize.py file
site_customize_path = site.getsitecustomize()

print("Sitecustomize file:", site_customize_path)

5. site.removesitedir(path)

import site

# Add a custom site directory
site.addsitedir('/path/to/custom/site-packages')

# Remove the custom site directory
site.removesitedir('/path/to/custom/site-packages')

6. site.setusersitepackages(True | False)

import site

# Enable searching for user-site-packages
site.setusersitepackages(True)

# Now Python will look in the user's site-packages directory if available
try:
    import my_user_module
except ImportError as e:
    print(f"Module not found: {e}")

7. site.clearsitepackages()

import site

# Add a custom site directory
site.addsitedir('/path/to/custom/site-packages')

# Clear the list of site-packages directories
site.clearsitepackages()

# Now Python will only search in the standard library path
try:
    import my_standard_module
except ImportError as e:
    print(f"Module not found: {e}")

8. site.addsitedir(path, setpath=True)

import site

# Add a custom site directory to the Python path and update PYTHONPATH
site.addsitedir('/path/to/custom/site-packages', setpath=True)

# Now you can import modules from this directory and PYTHONPATH is updated
try:
    import my_custom_module
except ImportError as e:
    print(f"Module not found: {e}")

9. site.removesitedir(path, unsetsitepackages=False)

import site

# Add a custom site directory to the Python path
site.addsitedir('/path/to/custom/site-packages')

# Remove the custom site directory and update PYTHONPATH
site.removesitedir('/path/to/custom/site-packages', unsetsitepackages=True)

# Now Python will only search in the standard library path and PYTHONPATH is updated
try:
    import my_standard_module
except ImportError as e:
    print(f"Module not found: {e}")

10. site.addsitedir(path, setpath=True)

import site

# Add a custom site directory to the Python path and update PYTHONPATH
site.addsitedir('/path/to/custom/site-packages', setpath=True)

# Now you can import modules from this directory and PYTHONPATH is updated
try:
    import my_custom_module
except ImportError as e:
    print(f"Module not found: {e}")

These code examples demonstrate various functionalities of the site module, including adding custom directories to the Python path, accessing specific directories where Python looks for site-specific packages, and managing the PYTHONPATH environment variable.

sys - System-specific parameters and functions.md

sys - System-specific parameters and functions

The sys module in Python provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. Below are comprehensive and well-documented code examples for each functionality provided by the sys module.

1. sys.version

This function returns a string containing the version number of the Python interpreter as a string in the form 'x.x.y'.

# Example: Retrieve the Python version
import sys

print("Python version:", sys.version)

2. sys.executable

This function returns the full path to the interpreter that started the current program.

# Example: Retrieve the executable file path
import sys

print("Executable path:", sys.executable)

3. sys.platform

This function returns a string identifying the underlying platform on which Python is running.

# Example: Retrieve the platform
import sys

print("Platform:", sys.platform)

4. sys.modules

This variable holds the dictionary of all currently loaded modules, with keys as module names and values as their corresponding module objects.

# Example: Print all imported modules
import sys

for name in sys.modules:
    print(name)

5. sys.maxsize

This constant holds the maximum integer value that can be stored in an integer type on the current platform.

# Example: Retrieve the maximum size of integers
import sys

print("Maximum size of integers:", sys.maxsize)

6. sys.argv

This list contains the command-line arguments passed to the script when it was run. The first element is always a string 'scriptname', and the rest are the remaining arguments.

# Example: Print command-line arguments
import sys

print("Command-line arguments:", sys.argv)

7. sys.path

This list contains the current Python module search path. This is used when importing modules.

# Example: Print current Python path
import sys

print("Current Python path:", sys.path)

8. sys.stdin, sys.stdout, and sys.stderr

These are file-like objects representing standard input, standard output, and standard error streams, respectively. You can use them to read from or write to these streams.

# Example: Read from stdin and print the result
import sys

user_input = sys.stdin.read()
print("User input:", user_input)

# Example: Write to stdout
import sys

sys.stdout.write("Hello, World!\n")

9. sys.exit([status])

This function exits the script with an optional exit status code. If no argument is given, it defaults to 0.

# Example: Exit the program
import sys

print("Exiting the program...")
sys.exit(0)

10. sys.getsizeof(obj[, default])

This function returns the size of an object in bytes. The default parameter is used if obj is a type object, not an instance.

# Example: Get the size of an integer
import sys

num = 123456
print("Size of", num, ":", sys.getsizeof(num))

# Example: Get the size of a string
str_obj = "Hello, World!"
print("Size of", str_obj, ":", sys.getsizeof(str_obj))

11. sys.settrace(func)

This function sets a global trace function for all currently running Python programs.

# Example: Set a global trace function
import sys

def my_trace(frame, event, arg):
    print(event, frame.f_lineno)

sys.settrace(my_trace)

12. sys.getdefaultencoding()

This function returns the default encoding used by the interpreter for strings.

# Example: Retrieve the default encoding
import sys

print("Default encoding:", sys.getdefaultencoding())

13. sys.setrecursionlimit(limit)

This function sets the maximum depth of recursion. If a recursive function calls itself too many times, it will raise a RecursionError.

# Example: Set the recursion limit
import sys

print("Current recursion limit:", sys.getrecursionlimit())
sys.setrecursionlimit(1000)
print("New recursion limit:", sys.getrecursionlimit())

14. sys.exitfunc

This variable holds a function to be called when the interpreter exits, such as at the end of a program or on an error.

# Example: Set an exit function
import sys

def my_exit_function():
    print("Exiting with custom message...")

sys.exitfunc = my_exit_function

15. sys.dont_write_bytecode

This variable is used to prevent the creation of .pyc files.

# Example: Disable bytecode writing
import sys

print("Bytecode writing enabled:", not sys.dont_write_bytecode)
sys.dont_write_bytecode = True
print("Bytecode writing disabled:", not sys.dont_write_bytecode)

16. sys.flags

This dictionary contains various flags that control the behavior of Python.

# Example: Print all flags
import sys

for name, value in vars(sys).items():
    if isinstance(value, bool) and not name.startswith('__'):
        print(name, value)

These examples cover a wide range of functionalities provided by the sys module. Each example is thoroughly documented to ensure clarity and ease of understanding.

sysconfig - Provide access to Python s configuration information.md

sysconfig - Provide access to Pythonโ€™s configuration information

The sysconfig module in Python provides access to Python's configuration settings, including paths to various directories such as the site-packages directory, the interpreter executable, and more. This module is particularly useful for developers who need to understand or modify the Python environment at runtime.

Below are comprehensive code examples that cover various functionalities provided by the sysconfig module:

import sysconfig

# Example 1: Get the path to the site-packages directory
site_packages_path = sysconfig.get_python_lib()
print("Path to the site-packages directory:", site_packages_path)

# Example 2: Determine the Python executable used for a specific interpreter
executable_path = sysconfig.get_executable()
print("Python executable path:", executable_path)

# Example 3: Get the configuration variables as a dictionary
config_vars = sysconfig.get_config_vars()
for key, value in config_vars.items():
    print(f"{key}: {value}")

# Example 4: Check if a specific platform is supported by Python
is_platform_supported = sysconfig.is_python_platform('Linux')
print("Is 'Linux' a supported platform?", is_platform_supported)

# Example 5: Get the path to a specific file in the site-packages directory
site_packages_file_path = sysconfig.get_path('py_modules', module_name='example_module')
if site_packages_file_path:
    print(f"Path to 'example_module.py': {site_packages_file_path}")
else:
    print("Module not found in site-packages.")

# Example 6: Get the build environment variables
build_vars = sysconfig.get_build_info()
print("Build environment information:", build_vars)

# Example 7: Check if a specific file exists in the Python installation directory
file_in_python_dir = sysconfig.find_executable('python')
if file_in_python_dir:
    print(f"Python executable found at {file_in_python_dir}")
else:
    print("Python executable not found.")

# Example 8: Get the platform-specific configuration variables
platform_config_vars = sysconfig.get_platform()
print("Platform-specific configuration:", platform_config_vars)

# Example 9: Get the full path to a specific resource in the Python installation directory
resource_path = sysconfig.get_resources_path('site-packages')
if resource_path:
    print(f"Path to site-packages resources: {resource_path}")
else:
    print("Resource not found.")

# Example 10: Check if the interpreter is running from a source distribution
is_from_source_dist = sysconfig.is_python_build()
print("Is the interpreter running from a source distribution?", is_from_source_dist)

# Example 11: Get the path to a specific file in a site-packages directory for a given interpreter
interpreter_site_packages_path = sysconfig.get_paths_for_interpreter(executable_path)
for key, value in interpreter_site_packages_path.items():
    print(f"{key}: {value}")

# Example 12: Check if a specific module is installed and accessible
module_installed = sysconfig.exists_module('os')
print("Is 'os' module installed?", module_installed)

# Example 13: Get the path to a specific interpreter's site-packages directory
interpreter_site_packages_path = sysconfig.get_python_lib(prefix=executable_path)
print(f"Path to {executable_path}'s site-packages directory:", interpreter_site_packages_path)

# Example 14: Check if a specific file exists in the Python installation directory with a specific interpreter
file_in_specific_interpreter = sysconfig.find_executable('python', executable_path)
if file_in_specific_interpreter:
    print(f"Python executable found at {file_in_specific_interpreter}")
else:
    print("Python executable not found.")

# Example 15: Get the path to a specific resource in the Python installation directory for a given interpreter
interpreter_resource_path = sysconfig.get_resources_path('site-packages', prefix=executable_path)
if interpreter_resource_path:
    print(f"Path to site-packages resources for {executable_path}: {interpreter_resource_path}")
else:
    print("Resource not found.")

# Example 16: Check if the interpreter is running from a precompiled binary
is_from_precompiled_bin = sysconfig.is_python_built()
print("Is the interpreter running from a precompiled binary?", is_from_precompiled_bin)

# Example 17: Get the path to a specific file in a site-packages directory for a given interpreter and module
interpreter_site_packages_module_path = sysconfig.get_data_files(executable_path, 'module_name')
if interpreter_site_packages_module_path:
    print(f"Path to 'module_name' in {executable_path}'s site-packages:", interpreter_site_packages_module_path)
else:
    print("Module not found.")

# Example 18: Check if a specific file exists in the Python installation directory with a specific interpreter and module
file_in_interpreter_module = sysconfig.find_executable('python', executable_path, 'module_name')
if file_in_interpreter_module:
    print(f"Python executable found at {file_in_interpreter_module}")
else:
    print("Python executable not found.")

Explanation of the Code Examples:

  1. Example 1: Retrieves the path to the site-packages directory for the currently running Python interpreter.
  2. Example 2: Determines the path to the Python executable used by the current interpreter.
  3. Example 3: Fetches a dictionary of all configuration variables available via sysconfig.get_config_vars().
  4. Example 4: Checks if a specified platform is supported by Python using sysconfig.is_python_platform().
  5. Example 5: Finds the path to a specific module in the site-packages directory.
  6. Example 6: Retrieves build environment information using sysconfig.get_build_info().
  7. Example 7: Checks for the presence of a Python executable at a specified path using sysconfig.find_executable().
  8. Example 8: Provides platform-specific configuration variables.
  9. Example 9: Finds paths to resources within the Python installation directory.
  10. Example 10: Determines if the interpreter is running from a source distribution.
  11. Example 11: Retrieves site-packages directories for a specific interpreter.
  12. Example 12: Checks if a module is installed and accessible using sysconfig.exists_module().
  13. Example 13: Finds the path to an interpreter's site-packages directory by specifying the executable path.
  14. Example 14: Checks for the presence of a Python executable at a specified path with a specific interpreter.
  15. Example 15: Retrieves paths to resources within the Python installation directory for a specific interpreter.
  16. Example 16: Determines if the interpreter is running from a precompiled binary.
  17. Example 17: Finds paths to data files in a site-packages directory for a specific interpreter and module.
  18. Example 18: Checks for the presence of a Python executable at a specified path with a specific interpreter and module.

These examples cover various aspects of interacting with Python's configuration settings, providing a comprehensive overview of what can be achieved using the sysconfig module.

traceback - Print or retrieve a stack traceback.md

traceback - Print or retrieve a stack traceback

Below are comprehensive code examples that demonstrate various functionalities of the traceback module in Python, along with clear explanations and comments:

# Import the traceback module
import traceback

def example_function():
    # Simulate an exception for demonstration purposes
    try:
        result = 10 / 0
    except Exception as e:
        # Print a stack trace to the console
        traceback.print_exc()

        # Optionally, retrieve and print the traceback as a string
        tb_string = traceback.format_exc()
        print(tb_string)

def example_traceback():
    # Example of using traceback to catch and format an exception
    try:
        result = 10 / 0
    except Exception as e:
        # Use traceback.print_exception to print the traceback to the console
        traceback.print_exception(type(e), e, e.__traceback__)

        # Format the traceback into a string for further processing
        tb_string = traceback.format_exception(type(e), e, e.__traceback__)
        print(tb_string)

def example_traceback_with_frame_info():
    # Example of using traceback to extract frame information
    try:
        result = 10 / 0
    except Exception as e:
        # Use traceback.extract_tb to get the stack trace in list format
        tb_list = traceback.extract_tb(e.__traceback__)

        # Print each frame's filename, line number, function name, and code snippet
        for frame_info in tb_list:
            print(f"File: {frame_info.filename}, Line: {frame_info.lineno}, Function: {frame_info.function}")

        # Format the traceback into a string with more detailed information
        tb_string = traceback.format_exception(type(e), e, e.__traceback__)
        print(tb_string)

def example_traceback_with_tb_object():
    # Example of using traceback to work with the Traceback object directly
    try:
        result = 10 / 0
    except Exception as e:
        # Get the entire traceback object
        tb_obj = e.__traceback__

        # Print the traceback object's properties
        print(f"Traceback object: {tb_obj}")

        # Format the traceback into a string for further processing
        tb_string = traceback.format_exception(type(e), e, e.__traceback__)
        print(tb_string)

def example_traceback_with_file_object():
    # Example of using traceback to write to a file instead of console
    try:
        result = 10 / 0
    except Exception as e:
        # Open a file for writing the traceback
        with open("error_log.txt", "w") as log_file:
            # Use traceback.print_exception to write the traceback to the file
            traceback.print_exception(type(e), e, e.__traceback__, file=log_file)

            # Optionally, format the traceback into a string and print it for confirmation
            tb_string = traceback.format_exception(type(e), e, e.__traceback__)
            print(f"Formatted traceback written to 'error_log.txt':\n{tb_string}")

# Run example functions
example_function()
example_traceback()
example_traceback_with_frame_info()
example_traceback_with_tb_object()
example_traceback_with_file_object()

Explanation:

  1. example_function():
  2. Demonstrates how to print a stack trace using traceback.print_exc(), which prints the traceback to the console.

  3. example_traceback():

  4. Uses traceback.print_exception() to print and format the traceback into a string, which can be useful for logging or further processing.

  5. example_traceback_with_frame_info():

  6. Retrieves and prints detailed information about each frame in the stack trace using traceback.extract_tb(). This includes filename, line number, function name, and code snippet.

  7. example_traceback_with_tb_object():

  8. Accesses and prints the entire traceback object using e.__traceback__, which can provide additional debugging information if needed.

  9. example_traceback_with_file_object():

  10. Writes the traceback to a file instead of printing it to the console using traceback.print_exception(). This is useful for logging errors to a log file.

Each example includes comments that explain the purpose and functionality of each part of the code, making it easy to understand and modify as needed.

warnings - Warning control.md

warnings - Warning control

The warnings module in Python provides a flexible way to handle warning messages generated by the interpreter or libraries you use. It allows you to filter out unwanted warnings, issue warnings with custom categories and filters, and even enable or disable specific warning categories globally.

Here are comprehensive examples for various functionalities within the warnings module:

1. Simple Warning Example

# Import the warnings module
import warnings

# Define a custom warning class
class MyWarning(Warning):
    """Custom warning category."""
    pass

def generate_warning():
    # Generate a warning message using the custom warning class
    warnings.warn("This is a custom warning", MyWarning)

if __name__ == "__main__":
    generate_warning()

2. Filtering Warnings

# Import the warnings module
import warnings

# Define a custom warning class
class MyWarning(Warning):
    """Custom warning category."""
    pass

def generate_warning():
    # Generate a warning message using the custom warning class
    warnings.warn("This is a custom warning", MyWarning)

if __name__ == "__main__":
    # Filter out specific types of warnings
    with warnings.catch_warnings(record=True) as caught_warnings:
        warnings.simplefilter("ignore", MyWarning)
        generate_warning()

    # Print captured warnings
    for warning in caught_warnings:
        print(warning.message, warning.category, warning.filename, warning.lineno)

# Output will show: No output because the custom warning was ignored.

3. Suppressing Warnings

# Import the warnings module
import warnings

# Define a custom warning class
class MyWarning(Warning):
    """Custom warning category."""
    pass

def generate_warning():
    # Generate a warning message using the custom warning class
    warnings.warn("This is a custom warning", MyWarning)

if __name__ == "__main__":
    # Suppress all warnings globally
    warnings.filterwarnings('ignore')

    # Attempt to generate a warning
    try:
        generate_warning()
    except Exception as e:
        print(f"Exception caught: {e}")

# Output will show no warning being printed, and the exception will be caught.

4. Custom Warning Filters

# Import the warnings module
import warnings

# Define a custom warning class
class MyWarning(Warning):
    """Custom warning category."""
    pass

def generate_warning():
    # Generate a warning message using the custom warning class
    warnings.warn("This is a custom warning", MyWarning)

if __name__ == "__main__":
    # Create a custom filter to capture warnings from a specific module
    warnings.filterwarnings('always', category=MyWarning, module='your_module')

    # Attempt to generate a warning
    try:
        import your_module  # Replace 'your_module' with the actual module name
        generate_warning()
    except Exception as e:
        print(f"Exception caught: {e}")

# Output will show any warnings from 'your_module'.

5. Disabling Warnings

# Import the warnings module
import warnings

def disable_warnings():
    # Disable all warnings globally
    warnings.disable(warnings.all)

if __name__ == "__main__":
    disable_warnings()

6. Enabling Warnings

# Import the warnings module
import warnings

def enable_warnings():
    # Enable all warnings globally
    warnings.enable(warnings.all)

if __name__ == "__main__":
    enable_warnings()

7. Capturing Warnings

# Import the warnings module
import warnings

# Define a custom warning class
class MyWarning(Warning):
    """Custom warning category."""
    pass

def generate_warning():
    # Generate a warning message using the custom warning class
    warnings.warn("This is a custom warning", MyWarning)

if __name__ == "__main__":
    # Capture all warnings globally
    with warnings.catch_warnings(record=True) as caught_warnings:
        generate_warning()

    # Print captured warnings
    for warning in caught_warnings:
        print(warning.message, warning.category, warning.filename, warning.lineno)

These examples cover the basic functionalities of the warnings module, including generating custom warnings, filtering and suppressing warnings, and capturing warnings globally. You can expand these examples by importing specific modules or using more complex filters to suit your needs.

Software Packaging and Distribution

distutils - Building and installing Python packages.md

distutils - Building and installing Python packages

The distutils module is an older package that is now considered deprecated. It is used to build and install Python packages, but it has been largely replaced by newer tools such as setuptools and wheel. However, I will provide code examples for using the original distutils to illustrate how you might have built and installed a simple Python package in earlier versions of Python.

Example 1: Creating a Simple Package with Distutils

Step 1: Create a Directory for Your Package

First, create a directory where your package files will be stored. For example:

mkdir my_package
cd my_package

Step 2: Initialize the Package

Create an __init__.py file to mark this directory as a Python package:

# __init__.py
from .module1 import Module1
from .module2 import Module2

Step 3: Create Your Modules

Create two modules within your package. For example, create module1.py and module2.py with some basic functionality:

# module1.py
def greet(name):
    return f"Hello, {name}!"

# module2.py
def add_numbers(a, b):
    return a + b

Step 4: Create a Setup Script

Create a setup.py file to specify how your package should be built and installed:

# setup.py
from setuptools import setup

setup(
    name='my_package',
    version='0.1',
    packages=['my_package'],
)

Step 5: Build the Package

To build the package, use the following command in the terminal:

python setup.py sdist bdist_wheel

This will create a .tar.gz distribution and a wheel file in the dist/ directory.

Step 6: Install the Package

To install the package locally, run:

pip install dist/my_package-0.1-py3-none-any.whl

Or, if you have built a local source distribution (my_package-0.1.tar.gz), use:

pip install my_package-0.1.tar.gz

Example 2: Building and Installing Using setuptools (Recommended)

Step 1: Install setuptools

If you haven't already, you need to install setuptools. You can do this using pip:

pip install setuptools

Step 2: Use setup.py with setuptools

Ensure your setup.py file uses setuptools by adding the necessary import statement at the beginning:

# setup.py
from setuptools import setup, find_packages

setup(
    name='my_package',
    version='0.1',
    packages=find_packages(),
)

Step 3: Build and Install Using setuptools

Use the following command to build and install your package:

python setup.py bdist_wheel
pip install dist/my_package-0.1-py3-none-any.whl

or if you have a source distribution:

python setup.py sdist bdist_wheel
pip install my_package-0.1.tar.gz

Notes

These examples demonstrate how to create and install a simple Python package using both distutils and setuptools. For production environments, it's advisable to use setuptools for better support and features.

ensurepip - Bootstrapping the pip installer.md

ensurepip - Bootstrapping the pip installer

ensurepip Module Documentation

The ensurepip module provides a script that can be used to bootstrap the installation of the pip package manager on systems where it is not already installed. This is particularly useful during system initialization or when setting up new environments.

Usage

  1. Using sys.executable: The ensurepip module uses the Python executable itself to bootstrap the installation process. By default, it uses sys.executable, which points to the Python interpreter used by your current script.

python import ensurepip ensurepip.bootstrap()

  1. Customizing the Bootstrapping Process: You can specify a custom pip version or a specific installation directory for the pip package manager.

  2. Specifying a specific version of pip: python import ensurepip ensurepip.bootstrap(pip_version='19.3')

  3. Installing to a specific directory: python import ensurepip ensurepip.bootstrap(target='/path/to/custom/directory')

  4. Using sys.executable with Additional Arguments: You can pass additional arguments to the ensurepip.bootstrap() function if needed.

python import sys import ensurepip ensurepip.bootstrap(bootstrap_args=['--upgrade'])

Detailed Example

Here's a detailed example of how you might use the ensurepip module in a Python script:

import sys
import ensurepip

# Specify a custom version of pip and install it to a specific directory
def bootstrap_pip():
    # Ensure that pip is installed with a specific version and installed in a custom directory
    ensurepip.bootstrap(pip_version='19.3', target='/path/to/custom/directory')

# Example usage
if __name__ == "__main__":
    print("Booting up pip...")
    try:
        bootstrap_pip()
        print("pip has been successfully bootstrapped.")
    except ensurepip.PipError as e:
        print(f"An error occurred: {e}")

Notes

This example demonstrates how to use the ensurepip module to bootstrap the pip package manager in a Python script.

venv - Creation of virtual environments.md

venv - Creation of virtual environments

Creating a virtual environment in Python using venv is a straightforward process that allows you to manage dependencies for different projects independently without affecting each other. Below are comprehensive examples of how to use the venv module, including comments explaining each step.

Example 1: Creating a Virtual Environment Manually

import venv

# Specify the path where the virtual environment will be created
venv_path = '/path/to/your/project/env'

# Create the virtual environment
venv.create(venv_path)

print(f"Virtual environment created at {venv_path}")

Example 2: Activating a Virtual Environment (on Windows)

import subprocess

# Specify the path to the virtual environment's activate script
activate_script = f"{venv_path}\\Scripts\\activate"

# Run the activation command using subprocess
subprocess.run([activate_script])

print("Virtual environment activated. You can now use 'pip' and other commands.")

Example 3: Activating a Virtual Environment (on macOS/Linux)

import subprocess

# Specify the path to the virtual environment's activate script
activate_script = f"{venv_path}/bin/activate"

# Run the activation command using subprocess
subprocess.run(['source', activate_script], shell=True)

print("Virtual environment activated. You can now use 'pip' and other commands.")

Example 4: Creating a Virtual Environment Automatically with create Method

import venv

# Specify the path where the virtual environment will be created
venv_path = '/path/to/your/project/env'

# Create the virtual environment automatically
with venv.create(venv_path, with_pip=True) as env:
    print(f"Virtual environment created at {venv_path}")

Example 5: Deactivating a Virtual Environment

import sys

def deactivate():
    # Check if we are in an activated virtual environment
    if 'VIRTUAL_ENV' in os.environ:
        # Remove the VIRTUAL_ENV variable from the environment
        del os.environ['VIRTUAL_ENV']

        # Reassign sys.prefix and sys.executable to remove reference to the virtual environment
        sys.prefix = '/usr'  # or whatever is your default prefix
        sys.executable = '/usr/bin/python3.10'  # or whatever is your default Python executable

        print("Virtual environment deactivated.")
    else:
        print("Not in an activated virtual environment.")

# Call the deactivate function to exit the virtual environment
deactivate()

Example 6: Using pip within a Virtual Environment

import subprocess

# Specify the path to the virtual environment's bin directory
bin_dir = f"{venv_path}\\Scripts"

# Install a package using pip
subprocess.run([f'{bin_dir}\\pip', 'install', 'requests'])

print("Requests package installed in the virtual environment.")

Example 7: Listing Installed Packages

import subprocess

# Specify the path to the virtual environment's bin directory
bin_dir = f"{venv_path}\\Scripts"

# List all installed packages using pip list
subprocess.run([f'{bin_dir}\\pip', 'list'])

print("Installed packages listed.")

Example 8: Checking Python Version in a Virtual Environment

import sys

# Check the Python version within the virtual environment
if 'VIRTUAL_ENV' in os.environ:
    print(f"Python version in the virtual environment is {sys.version}")
else:
    print("Not in an activated virtual environment.")

# Output: Python version in the virtual environment is 3.12.x (or whatever your installed version is)

These examples demonstrate how to create, activate, and manage a virtual environment using Python's venv module. Each example includes comments explaining the purpose of the code snippet and how it interacts with the virtual environment.

zipapp - Manage executable Python zip archives.md

zipapp - Manage executable Python zip archives

The zipapp module in Python is used to create standalone executables from Python applications by embedding the interpreter into a ZIP archive. This allows you to distribute your application without requiring a separate Python installation, which can be useful for distributing small projects or for creating installable packages.

Here are some code examples that demonstrate various functionalities of the zipapp module:

Example 1: Creating an Executable from a Script

Suppose you have a simple script named my_script.py:

# my_script.py
def main():
    print("Hello, world!")

if __name__ == "__main__":
    main()

You can use the zipapp.create_archive function to create an executable from this script:

import zipapp

# Create a ZIP file containing the script and the Python interpreter
with open('my_script.zip', 'wb') as f:
    z = zipapp.create_archive(
        # Path to the entry point of the script (main module)
        'my_script.py',
        out_file=f,
        root_dir='.',
        strip_top_level=True  # Remove top-level directory from ZIP archive
    )

This command will create a standalone executable named my_script.zip that can be run without Python installed on the target system.

Example 2: Executing an Executable

To execute the created executable:

import subprocess

# Execute the created executable
subprocess.run(['./my_script.zip'])

This command will invoke the script embedded in my_script.zip.

Example 3: Installing the Executable as a Command-Line Tool

You can install the executable as a system command by creating an alias or by adding the directory containing the executable to your PATH environment variable. For simplicity, let's assume you want to add the executable to a specific directory:

import shutil
from pathlib import Path

# Specify the destination directory for the executable
destination = Path('/usr/local/bin')

# Ensure the destination exists
if not destination.exists():
    destination.mkdir(parents=True)

# Copy the executable from the zip file to the destination directory
shutil.copy('my_script.zip', destination / 'my_script')

Now, you can run my_script from anywhere in your system:

$ my_script
Hello, world!

Example 4: Running a Script with Specific Python Interpreter

If you want to specify a particular Python interpreter when running the script, you can use the -m option with the subprocess.run function:

import subprocess

# Run the script using a specific Python interpreter
subprocess.run(['python3', './my_script.zip'])

This command will ensure that the specified Python version is used to execute the script.

Example 5: Managing Dependencies

If your application has dependencies, you can include them in the ZIP archive by adding them to the root directory of the ZIP file. For example, if my_module.py also depends on another module:

# my_script.py
import my_module

def main():
    print("Hello, world!")
    my_module.main()

if __name__ == "__main__":
    main()

And include my_module.py in the ZIP file:

import zipapp

with open('my_script.zip', 'wb') as f:
    z = zipapp.create_archive(
        'my_script.py',
        out_file=f,
        root_dir='.',
        strip_top_level=True,
        include=['my_module.py']  # Include additional files in the ZIP
    )

This approach allows you to bundle all necessary components into a single, portable executable.

Example 6: Using zipapp.run_script

The zipapp.run_script function is another way to execute scripts directly from a zip archive without creating an executable file:

import zipapp

# Run the script directly from the ZIP archive
zipapp.run_script(
    'my_script.zip',
    # Command-line arguments passed to the script
    ['arg1', 'arg2']
)

This command will execute my_script.py with the specified arguments.

These examples provide a comprehensive overview of how you can use the zipapp module to create, manage, and run standalone Python applications. You can modify these examples based on your specific requirements and project structure.

Structured Markup Processing Tools

html - HyperText Markup Language support.md

html - HyperText Markup Language support

The html module in Python provides tools to parse HTML documents and render them as formatted text, including basic formatting features like bold, italic, lists, links, and images. Below are comprehensive and well-documented code examples for various functionalities provided by the html module.

Example 1: Parsing an HTML Document

This example demonstrates how to parse an HTML document using the BeautifulSoup library from the bs4 package, which is a popular choice for parsing HTML in Python.

pip install beautifulsoup4 requests
from bs4 import BeautifulSoup
import requests

# Fetch an HTML page
url = "https://example.com"
response = requests.get(url)

# Parse the HTML content
soup = BeautifulSoup(response.content, 'html.parser')

# Extract all links from the parsed document
links = soup.find_all('a')
for link in links:
    print(f"Link: {link.get('href')}, Text: {link.text}")

Example 2: Rendering HTML as a String

This example shows how to render an HTML document into a formatted string using the html module.

from html import escape

# Define some text with HTML tags
text = "<strong>Hello, <em>world!</em></strong>"

# Escape any special characters and render as HTML
formatted_text = escape(text)
print(formatted_text)  # Output: &lt;strong&gt;Hello, &lt;em&gt;world!&lt;/em&gt;&lt;/strong&gt;

Example 3: Rendering HTML to a File

This example demonstrates how to write an HTML document to a file.

from html import escape

# Define some text with HTML tags
text = "<h1>Welcome to Python</h1><p>This is a sample paragraph.</p>"

# Escape any special characters and render as HTML
formatted_text = escape(text)

# Write the formatted text to a file
with open('output.html', 'w') as file:
    file.write(formatted_text)

Example 4: Creating an HTML Page from Python

This example shows how to create a simple HTML page programmatically using the html module.

from html import escape

# Define some content for the HTML page
title = "My Custom Webpage"
content = "<h1>Welcome to My Website</h1><p>This is my custom webpage.</p>"

# Escape any special characters and render as HTML
formatted_title = escape(title)
formatted_content = escape(content)

# Create the HTML structure
html_page = f"""<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{formatted_title}</title>
</head>
<body>
    {formatted_content}
</body>
</html>"""

# Write the HTML page to a file
with open('custom_page.html', 'w') as file:
    file.write(html_page)

Example 5: Modifying an HTML Document

This example demonstrates how to modify an existing HTML document by adding or removing elements.

from bs4 import BeautifulSoup
import requests

# Fetch an HTML page
url = "https://example.com"
response = requests.get(url)

# Parse the HTML content
soup = BeautifulSoup(response.content, 'html.parser')

# Add a new paragraph to the body
new_paragraph = soup.new_tag("p")
new_paragraph.string = "This is a newly added paragraph."
soup.body.append(new_paragraph)

# Remove an existing element
existing_element = soup.find('a')
if existing_element:
    existing_element.decompose()

# Print the modified HTML content
print(soup.prettify())

Example 6: Escaping Special Characters

This example shows how to use the html module's escape function to safely render text containing HTML tags.

from html import escape

# Define some text with special characters and HTML tags
text = "<>&'\""

# Escape any special characters
escaped_text = escape(text)
print(escaped_text)  # Output: &lt;&gt;&#38;&#39;&quot;

Example 7: Encoding HTML Entities

This example demonstrates how to use the html module's unescape function to decode HTML entities.

from html import unescape

# Define some text with HTML entities
escaped_text = "&lt;>&#38;&#39;&quot;"

# Decode the HTML entities
decoded_text = unescape(escaped_text)
print(decoded_text)  # Output: <>&'"

Example 8: Parsing HTML from a String

This example shows how to parse an HTML string using the BeautifulSoup library.

from bs4 import BeautifulSoup

# Define an HTML string
html_string = "<h1>Hello, World!</h1><p>This is a paragraph.</p>"

# Parse the HTML string
soup = BeautifulSoup(html_string, 'html.parser')

# Extract all paragraphs from the parsed document
paragraphs = soup.find_all('p')
for para in paragraphs:
    print(para.text)

Example 9: Rendering HTML with Custom Styling

This example demonstrates how to render an HTML document with custom CSS styles.

from html import escape

# Define some text with HTML tags and a simple CSS style
text = "<h1>Welcome to Python</h1><p style='color: blue; font-size: 20px;'>This is my custom webpage.</p>"

# Escape any special characters and render as HTML
formatted_text = escape(text)
print(formatted_text)  # Output: &lt;h1&gt;Welcome to Python&lt;/h1&gt;&lt;p style='color: blue; font-size: 20px;'&gt;This is my custom webpage.&lt;/p&gt;

Example 10: Handling HTML Entities in a String

This example shows how to handle and decode HTML entities within a string.

from html import unescape

# Define a string containing HTML entities
html_entities = "&amp;&lt;&gt;"

# Decode the HTML entities
decoded_string = unescape(html_entities)
print(decoded_string)  # Output: & < >

These examples cover various aspects of working with HTML in Python using the html module. Each example is well-documented, includes comments explaining each step, and follows best practices for clarity and maintainability.

html.entities - Definitions of HTML general entities.md

html.entities - Definitions of HTML general entities

The html.entities module provides a comprehensive dictionary mapping HTML numeric character references to their corresponding characters. These entities are used in HTML documents to represent special characters that cannot be directly included due to formatting issues or restrictions. Below are several examples demonstrating how to use the html.entities module, including reading from and writing to entity files, converting between numeric and named entities, and using them in HTML strings.

Example 1: Reading Entity Definitions

import html.entities as ent

# Access all available HTML character entities as a dictionary
entity_dict = ent.entitydefs

# Print the first few key-value pairs from the entity dictionary
for name, code in list(entity_dict.items())[:5]:
    print(f"{name}: {code}")

Example 2: Writing Entity Definitions to a File

import html.entities as ent
import os

# Define the path where you want to save the entity definitions
output_file = "entity_definitions.txt"

# Create a list of all entities and their corresponding numeric values
entities = [(name, code) for name, code in ent.entitydefs.items()]

# Write the entities to a file
with open(output_file, "w") as file:
    for name, code in entities:
        file.write(f"{name}: {code}\n")

print(f"Entity definitions have been written to {output_file}")

Example 3: Converting Between Numeric and Named Entities

import html.entities as ent

# Convert a named entity to its numeric equivalent
named_entity = "gt"
numeric_value = ent.name2codepoint[named_entity]
print(f"The numeric value for '{named_entity}' is {numeric_value}")

# Convert a numeric entity back to its named equivalent
numeric_entity = 62
named_entity = ent.codepoint2name[numeric_entity]
print(f"The named entity for {numeric_entity} is '{named_entity}'")

Example 4: Using Entities in HTML Strings

import html
import html.entities as ent

# Define a string with special characters that can be represented by entities
html_string = "<div>This is an example of using HTML entities.</div>"

# Replace special characters with their corresponding named entities
escaped_html_string = html.escape(html_string)
print("Original HTML String:", html_string)
print("Escaped HTML String:", escaped_html_string)

# Convert back to the original string
unescaped_html_string = html.unescape(escaped_html_string)
print("Unescaped HTML String:", unescaped_html_string)

Example 5: Handling Non-ASCII Characters

import html.entities as ent

# Define a string with non-ASCII characters
non_ascii_string = "Hello, world! ๐Ÿ˜Š"

# Convert non-ASCII characters to their corresponding named entities
non_ascii_entities = {char: f"&#x{ord(char):04X};" for char in non_ascii_string if ord(char) > 127}

# Print the original string and its entity replacements
print("Original String:", non_ascii_string)
for char, entity in non_ascii_entities.items():
    print(f"{char}: {entity}")

Example 6: Using Entities with HTML Libraries

If you are using an HTML library like BeautifulSoup or lxml, the html.entities module can be used to handle character entities in parsed content.

from bs4 import BeautifulSoup
from html import entities as ent

# Define a string with HTML containing special characters
html_content = "<div>This is a <span>sample</span> of HTML content with special characters: &gt; &lt;</div>"

# Parse the HTML using BeautifulSoup
soup = BeautifulSoup(html_content, "html.parser")

# Print the parsed content and its entities
print("Original HTML Content:", html_content)
print("Parsed HTML Content:", str(soup))

# Use the entity dictionary to manually replace named entities if necessary
for text_node in soup.find_all(text=True):
    new_text = text_node
    for name, code in ent.html5.items():
        new_text = new_text.replace(name, f"&#{code};")
    text_node.replace_with(new_text)

print("Parsed HTML Content with Entities Replaced:", str(soup))

Note: To use BeautifulSoup, you need to install the beautifulsoup4 package using pip:

pip install beautifulsoup4

These examples cover a variety of scenarios involving the html.entities module, from basic entity handling to more advanced uses in web development and data processing.

html.parser - Simple HTML and XHTML parser.md

html.parser - Simple HTML and XHTML parser

Certainly! Below are comprehensive and well-documented examples for using the html.parser module in Python, which is part of the standard library. This module provides a simple way to parse HTML and XHTML documents.

Example 1: Basic Parsing with HTMLParser

This example demonstrates how to use the HTMLParser class from the html.parser module to extract text from an HTML document.

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.data = []

    def handle_data(self, data):
        # This method is called for each block of plain text in the document
        self.data.append(data)

def parse_html(html_content):
    parser = MyHTMLParser()
    parser.feed(html_content)
    return parser.data

# Example usage
html_content = """
<html>
<head>
    <title>Sample HTML</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample paragraph.</p>
</body>
</html>
"""

parsed_data = parse_html(html_content)
print(parsed_data)

Explanation:

Example 2: Extracting Links with BeautifulSoup

For more complex parsing tasks, you might use BeautifulSoup, which provides a more powerful interface for working with HTML and XML documents.

pip install beautifulsoup4

from bs4 import BeautifulSoup

def extract_links(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')
    links = [a['href'] for a in soup.find_all('a', href=True)]
    return links

# Example usage
html_content = """
<html>
<head>
    <title>Sample HTML</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample paragraph.</p>
    <a href="https://www.example.com">Visit Example</a>
    <a href="https://www.python.org">Python Website</a>
</body>
</html>
"""

links = extract_links(html_content)
print(links)

Explanation:

Example 3: Parsing Attributes

You can also extract attributes from specific elements using BeautifulSoup.

from bs4 import BeautifulSoup

def extract_title(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')
    title = soup.find('title').get_text()
    return title

# Example usage
html_content = """
<html>
<head>
    <title>Sample HTML</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample paragraph.</p>
</body>
</html>
"""

title = extract_title(html_content)
print(title)

Explanation:

These examples demonstrate how to use different parsing techniques with html.parser and BeautifulSoup, covering basic extraction, more complex operations like link extraction, and attribute access.

Superseded Modules

imp - Access the import internals.md

imp - Access the import internals

The imp module is a legacy module used to load modules dynamically, but it has been largely replaced by the importlib module, which provides a more modern and flexible interface for importing modules. However, if you need to interact with or understand how imp works, here are some basic examples:

Example 1: Using imp.load_module() (Legacy Functionality)

The imp.load_module() function is used to load a Python module dynamically from its source code.

import imp

# Define the file path to the Python module you want to import
module_path = 'path/to/your/module.py'

# Load the module
module = imp.load_source('module_name', module_path)

# Access and use the loaded module
print(module.some_function())

Example 2: Using imp.find_module() (Legacy Functionality)

The imp.find_module() function can be used to locate a Python module file.

import imp

# Define the name of the module you are looking for
module_name = 'your_module'

# Find the location of the module file
try:
    path, filename, description = imp.find_module(module_name)
except ImportError:
    print(f"Module '{module_name}' not found.")
else:
    print(f"Found {filename} at {path}")

Example 3: Using imp.load_compiled() (Legacy Functionality)

The imp.load_compiled() function is used to load a compiled Python module from its bytecode file.

import imp

# Define the path to the compiled module file
module_path = 'path/to/your/module.pyc'

# Load the compiled module
module = imp.load_compiled('module_name', module_path)

# Access and use the loaded module
print(module.some_function())

Example 4: Using imp.get_suffixes() (Legacy Functionality)

The imp.get_suffixes() function returns a list of tuples containing suffixes for Python modules.

import imp

# Get all suffixes for Python modules
suffixes = imp.get_suffixes()

for suffix in suffixes:
    print(f"Suffix: {suffix}")

Example 5: Using imp.is_frozen() (Legacy Functionality)

The imp.is_frozen() function returns True if the module is being run as a frozen executable.

import imp

# Check if the module is being run as a frozen executable
if imp.is_frozen():
    print("Module is being run as a frozen executable.")
else:
    print("Module is being run from source.")

Example 6: Using imp.get_magic() (Legacy Functionality)

The imp.get_magic() function returns the magic number used to detect Python bytecode files.

import imp

# Get the magic number for Python bytecode files
magic_number = imp.get_magic()

print(f"Magic Number: {magic_number}")

Example 7: Using imp.get_code() (Legacy Functionality)

The imp.get_code() function returns the code object for a given module.

import imp

# Define the name of the module you are looking for
module_name = 'your_module'

# Get the code object for the module
try:
    importlib.import_module(module_name)
except ImportError as e:
    print(f"Module '{module_name}' not found.")
else:
    code_obj = imp.get_code(module_name)

Example 8: Using imp.get_info() (Legacy Functionality)

The imp.get_info() function returns information about a module.

import imp

# Define the name of the module you are looking for
module_name = 'your_module'

# Get information about the module
try:
    importlib.import_module(module_name)
except ImportError as e:
    print(f"Module '{module_name}' not found.")
else:
    info = imp.get_info(module_name)
    print(info)

These examples provide a basic understanding of how to use imp for loading and interacting with Python modules. Note that while these functions are still available, they are considered legacy and may be removed in future versions of Python. Consider using importlib for new development if possible.

optparse - Parser for command line options.md

optparse - Parser for command line options

The optparse module is a simple way to handle command-line options in Python, similar to how getopt works in C. It provides a flexible framework for parsing command-line options and arguments.

Below are comprehensive code examples that cover various functionalities of the optparse module:

import optparse

def main():
    # Create an OptionParser object
    parser = optparse.OptionParser()

    # Define command-line options
    # long_opt: --option
    # short_opt: -o
    # dest: variable to store the option's value
    # help: description of the option
    parser.add_option("--input", "-i", dest="input_file", help="Input file path")

    parser.add_option("--output", "-o", dest="output_file", help="Output file path")

    parser.add_option(
        "--verbose",
        "-v",
        action="store_true",
        dest="verbose",
        help="Enable verbose mode"
    )

    # Parse the command-line options and arguments
    (options, args) = parser.parse_args()

    # Check if required options are provided
    if not options.input_file:
        print("Error: Input file path is required")
        parser.print_help()
        return

    if not options.output_file:
        print("Error: Output file path is required")
        parser.print_help()
        return

    # Process the parsed options and arguments
    process_options(options, args)

def process_options(options, args):
    print(f"Input File: {options.input_file}")
    print(f"Output File: {options.output_file}")
    if options.verbose:
        print("Verbose mode is enabled")

if __name__ == "__main__":
    main()

Explanation:

  1. OptionParser Initialization:
  2. We create an OptionParser object which is used to define and parse the command-line options.

  3. Defining Options:

  4. add_option method is used to define various types of command-line options:

  5. Parsing Options and Arguments:

  6. The parse_args() method is called to parse the command-line arguments. It returns a tuple containing two elements: a namespace object (options) with attributes set from the parsed options, and a list of remaining arguments (args).

  7. Validation:

  8. We check if both input and output file paths are provided. If not, we print an error message and help information using parser.print_help().

  9. Processing Options:

  10. The process_options function demonstrates how to use the parsed options. It prints the values of the input and output files and checks if verbose mode is enabled.

Usage:

To run this script from the command line, you can use the following commands:

python script.py --input=input.txt --output=output.txt -v

This will execute the script with the specified options.

Text Processing Services

difflib - Helpers for computing deltas.md

difflib - Helpers for computing deltas

Below is a comprehensive set of code examples demonstrating various functionalities provided by the difflib module, which is part of Python's standard library and helps in comparing sequences to find differences. Each example includes detailed comments explaining what the code does.

import difflib

# Example 1: Basic Sequence Comparison
original = "The quick brown fox jumps over the lazy dog"
modified = "The fast brown fox leaped over the sleepy hound"

# Create a Differ object to compare two sequences (strings in this case)
differ = difflib.Differ()

# Get a list of differences between original and modified strings
diffs = list(differ.compare(original.split(), modified.split()))

print("Differences (simple):")
for diff in diffs:
    print(diff)

# Example 2: Context Format Differences
context_diffs = list(difflib.context_diff(original.split(), modified.split()))

print("\nDifferences (context format):")
for diff in context_diffs:
    print(diff)

# Example 3: Html Format Differences
html_differ = difflib.HtmlDiff()
html_diffs = html_differ.make_file(original.splitlines(), modified.splitlines())

with open("diff.html", "w") as f:
    f.write(html_diffs)
print("\nDifferences (HTML format) written to diff.html")

# Example 4: SequenceMatcher - Comparing Similarity
text1 = """The quick brown fox jumps over the lazy dog"""
text2 = """A fast brown fox leaped over a drowsy hound"""

matcher = difflib.SequenceMatcher(None, text1.split(), text2.split())

print("\nSimilarity Score:", matcher.ratio())  # Output: Similarity score between 0 and 1

# Example 5: Find Matches in Two Sequences
sequence_a = "The quick brown fox jumps over the lazy dog"
sequence_b = "A fast brown fox leaped over a drowsy hound"

sequence_a_words = sequence_a.split()
sequence_b_words = sequence_b.split()

matcher = difflib.SequenceMatcher(None, sequence_a_words, sequence_b_words)

for tag, i1, i2, j1, j2 in matcher.get_opcodes():
    if tag == 'equal':  # Lines that are equal
        print("Equal:", (i1, i2), " - ", sequence_a_words[i1:i2])
    elif tag == 'insert':  # New lines in b
        print("Insert:", (j1, j2), " - ", sequence_b_words[j1:j2])
    elif tag == 'delete':  # Removed lines from a
        print("Delete:", (i1, i2), " - ", sequence_a_words[i1:i2])
    elif tag == 'replace':  # Replaced lines in both sequences
        print("Replace:", (i1, i2), " to ", (j1, j2), " - ", sequence_a_words[i1:i2], " -> ", sequence_b_words[j1:j2])

# Example 6: Get Close Matches Using SequenceMatcher
word_list = ["dog", "cat", "tiger", "lion", "fox"]
search_word = "foxe"

matches = difflib.get_close_matches(search_word, word_list, n=3, cutoff=0.8)

print("\nClose matches to 'foxe':")
for match in matches:
    print(match)

Explanation:

  1. Basic Sequence Comparison: The Differ class is used to compare two sequences (strings) and output the differences word by word.

  2. Context Format Differences: The context_diff function provides a context format for the differences, which includes additional context lines around changes.

  3. Html Format Differences: Generates an HTML representation of the differences that can be saved to a file or displayed in web browsers.

  4. SequenceMatcher - Comparing Similarity: Measures the similarity between two sequences using SequenceMatcher. It returns a ratio ranging from 0 to 1, where 1 means identical and 0 means no common elements.

  5. Find Matches in Two Sequences: Uses get_opcodes method of SequenceMatcher to find insertions, deletions, replacements, and equal parts between two sequences.

  6. Get Close Matches Using SequenceMatcher: Finds close matches for a word within a list of words using the get_close_matches function, which is useful in spell-checking or autocomplete features.

These examples should cover most common use cases where you need to compare sequences or find differences in Python programs.

re - Regular expression operations.md

re - Regular expression operations

Below are comprehensive code examples covering various functionalities provided by the re (regular expressions) module in Python 3.12. These examples include detailed comments explaining each step.

import re

# Example 1: Basic pattern matching using search()
def example_search():
    """
    This function demonstrates basic pattern matching using re.search().

    The search() method scans through the string, looking for any location where 
    the regular expression pattern produces a match. It returns a Match object if found.
    If no matches are found, it returns None.
    """
    text = "Hello, my email is example@example.com"
    # Define the regex pattern to find an email address
    pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"

    match = re.search(pattern, text)
    if match:
        print(f"Email found: {match.group()}")
    else:
        print("No email found.")

# Example 2: Finding all matches using findall()
def example_findall():
    """
    This function demonstrates finding all non-overlapping matches of a pattern in a string.

    The findall() method returns a list containing all the match objects for every match 
    of the pattern found in the string. If no matches are found, it returns an empty list.
    """
    text = "The rain in Spain stays mainly in the plain."
    # Define the regex pattern to find words starting with 's'
    pattern = r"\bs\w+"

    matches = re.findall(pattern, text)
    print(f"Matches: {matches}")

# Example 3: Substituting strings using sub()
def example_sub():
    """
    This function demonstrates how to replace parts of a string where the 
    regular expression pattern matches.

    The sub() method replaces occurrences of the pattern with the specified replacement. 
    The replacement can be a string or a callable object (a function).
    """
    text = "The quick brown fox jumps over the lazy dog."
    # Define the regex pattern to replace 'fox' with 'cat'
    pattern = r"fox"

    # Using a simple string as the replacement
    result = re.sub(pattern, "cat", text)
    print(f"Simple substitution: {result}")

    # Using a function as the replacement
    def replacer(match):
        return match.group().upper()

    result_func = re.sub(pattern, replacer, text)
    print(f"Function-based substitution: {result_func}")

# Example 4: Compilation and usage of regular expressions using compile()
def example_compile():
    """
    This function demonstrates the use of re.compile() to create a pattern object.
    A compiled pattern can be used for multiple matches without the need to repeat the search().

    The compile() method returns a RegexObject that has methods suitable for searching 
    and replacing text according to the regular expression pattern.
    """
    text = "I have 12 apples, 34 bananas, and 56 cherries."
    # Define the regex pattern to find numbers
    pattern = r"\d+"

    compiled_pattern = re.compile(pattern)

    matches = compiled_pattern.findall(text)
    print(f"Matches: {matches}")

# Example 5: Using patterns with flags using match()
def example_match_flags():
    """
    This function demonstrates the use of different flags in regular expressions.

    Flags modify the behavior of a pattern. Commonly used flags include:
        - re.IGNORECASE
        - re.MULTILINE
        - re.DOTALL

    The match() method attempts to apply the pattern at the start of the string. 
    It returns a Match object if the pattern is found, otherwise None.
    """
    text = "Hello\nWorld"

    # Case-insensitive search
    pattern = r"hello"
    match = re.match(pattern, text, flags=re.IGNORECASE)
    print(f"Match (ignore case): {match}")

    # Multiline search
    pattern = r"^Hello.*World$"
    match = re.match(pattern, text, flags=re.MULTILINE)
    if match:
        print("Multiline match: Match found")
    else:
        print("Multiline match: No match")

# Example 6: Matching patterns with lookaheads and lookbehinds
def example_lookahead():
    """
    This function demonstrates the use of positive and negative lookahead and lookbehind assertions.

    Lookaheads and lookbehinds are zero-width matching assertions. 
    They check for a pattern without including it in the match result.
    """
    text = "The quick brown fox jumps over the lazy dog."

    # Positive lookahead
    pattern = r"fox(?=\s+jumps)"
    matches = re.findall(pattern, text)
    print(f"Positive lookahead: {matches}")

    # Negative lookbehind
    pattern = r"(?<!quick)\s+"
    matches = re.findall(pattern, text)
    print(f"Negative lookbehind: {matches}")

# Running the examples
if __name__ == "__main__":
    example_search()
    example_findall()
    example_sub()
    example_compile()
    example_match_flags()
    example_lookahead()

This code provides a comprehensive set of examples to demonstrate various functionalities provided by the re module, including basic pattern matching, finding all matches, substituting strings, compiling patterns, using flags, and utilizing lookaheads/lookbehinds.

readline - GNU readline interface.md

readline - GNU readline interface

The readline module in Python provides a convenient way to handle command line editing, history management, and completion features using GNU Readline.

Here are comprehensive code examples demonstrating various functionalities of the readline module:

1. Basic Usage

import readline

# Prompt the user for input with basic readline capabilities
user_input = input("Enter something: ")
print(f"You entered: {user_input}")

2. Customizing the Prompt

You can customize the prompt to provide more context or instructions to the user.

import readline

def custom_prompt(line):
    return ">>> "

def complete_func(text, state):
    lines = ["apple", "banana", "cherry"]
    return (lines[state] + ' ') if state < len(lines) else None

readline.set_completer(complete_func)
readline.set_completer_delims(' \t\n')
readline.set_startup_hook(lambda: readline.parse_and_bind("tab: complete"))
readline.parse_and_bind("set show-all-if-ambiguous on")
readline.parse_and_bind("bind ^I rl_complete")  # Use Tab for completion

readline.set_pre_input_hook(custom_prompt)

3. Adding History Management

The readline module supports history management using the history list.

import readline

# Append input to the history list
readline.add_history("first entry")
readline.add_history("second entry")

# Retrieve and print a specific entry from the history list
print(f"History item 1: {readline.get_history_item(1)}")

4. Using Completion Functions

Completion functions allow you to provide suggestions based on user input.

import readline

def complete_func(text, state):
    lines = ["apple", "banana", "cherry"]
    return (lines[state] + ' ') if state < len(lines) else None

readline.set_completer(complete_func)
readline.parse_and_bind("tab: complete")

5. Prompting with Multiple Choices

You can prompt the user for multiple choices by using a custom completion function.

import readline

def choice_completion(text, state):
    choices = ["yes", "no", "maybe"]
    return (choices[state] + ' ') if state < len(choices) else None

readline.set_completer(choice_completion)
readline.parse_and_bind("tab: complete")

user_choice = input("Do you agree? (yes/no/maybe): ")
print(f"Your choice was: {user_choice}")

6. Using Pre Input Hooks

Pre-input hooks allow you to modify user input before it is processed.

import readline

def custom_prompt(line):
    return ">>> "

def complete_func(text, state):
    lines = ["apple", "banana", "cherry"]
    return (lines[state] + ' ') if state < len(lines) else None

readline.set_completer_delims(' \t\n')
readline.set_completer(complete_func)
readline.set_startup_hook(lambda: readline.parse_and_bind("tab: complete"))
readline.parse_and_bind("set show-all-if-ambiguous on")
readline.parse_and_bind("bind ^I rl_complete")  # Use Tab for completion

readline.set_pre_input_hook(custom_prompt)

7. Using History Manipulation Functions

The history list provides functions to manipulate history entries.

import readline

# Append a new entry to the history
readline.add_history("first entry")

# Delete an entry from the history by index
readline.remove_history_item(0)

# Retrieve all entries in the history as a list
history_list = readline.get_current_history_length()
print(f"Number of history items: {history_list}")

# Clear the entire history
readline.clear_history()

8. Using Readline Options

You can set various options to customize the behavior of readline.

import readline

# Set option to display all possible completions when ambiguous
readline.parse_and_bind("set show-all-if-ambiguous on")

# Enable tab completion
readline.parse_and_bind("tab: complete")

These examples cover a range of functionalities available in the readline module, demonstrating how to customize prompts, manage history, implement completions, and manipulate user input through pre-input hooks.

rlcompleter - Completion function for GNU readline.md

rlcompleter - Completion function for GNU readline

The rlcompleter module in Python provides a way to enable completion features for interactive shell sessions using the GNU Readline library. This can be particularly useful for enhancing productivity by providing auto-completion as you type commands or variable names.

Below are comprehensive code examples demonstrating various functionalities of the rlcompleter module:

1. Basic Completion

First, ensure that the GNU Readline library is installed on your system. You can install it using your package manager (e.g., apt-get install libreadline-dev for Ubuntu).

Here's a basic example of how to use rlcompleter in a Python script:

import readline
import rlcompleter

# Set the completer function to use rlcompleter
readline.set_completer(rlcompleter.Completer().complete)

# Enable auto-completion
readline.parse_and_bind('tab: complete')

# Example usage of the completer
def example_usage():
    print("Type a string and press 'Tab' for completion:")
    while True:
        try:
            input_string = input()
            print(f"You entered: {input_string}")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

2. Custom Completion Function

You can also create a custom completion function by subclassing rlcompleter.Completer and overriding the _complete method.

import readline
import rlcompleter

class CustomCompleter(rlcompleter.Completer):
    def complete(self, text, state):
        # Define your own completion logic here
        matches = [item for item in dir() if item.startswith(text)]
        return matches[state] if 0 <= state < len(matches) else None

# Set the custom completer function to use rlcompleter
readline.set_completer(CustomCompleter().complete)

# Enable auto-completion
readline.parse_and_bind('tab: complete')

# Example usage of the custom completer
def example_usage():
    print("Type a string and press 'Tab' for completion:")
    while True:
        try:
            input_string = input()
            print(f"You entered: {input_string}")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

3. Completion for Custom Objects

If you have custom objects and want to provide completion for them, you can override the _complete method again:

import readline
import rlcompleter

class MyClass:
    def __init__(self, name):
        self.name = name

class InstanceCompleter(rlcompleter.Completer):
    def complete(self, text, state):
        if state == 0:
            # Retrieve all MyClass instance names starting with 'text'
            self.matches = [name for name, obj in globals().items() if isinstance(obj, MyClass) and name.startswith(text)]
        try:
            return self.matches[state]
        except IndexError:
            return None

def example_usage():
    obj1 = MyClass("Object 1")
    obj2 = MyClass("Object 2")

    # Set up completion for instances of MyClass
    class_instance_completer = InstanceCompleter()
    readline.set_completer(class_instance_completer.complete)

    # Enable auto-completion
    readline.parse_and_bind('tab: complete')

    print("Type 'obj' and press 'Tab' for completion:")
    while True:
        try:
            input_string = input()
            obj = eval(input_string)
            if isinstance(obj, MyClass):
                print(f"You selected: {obj.name}")
            else:
                print("Invalid object")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

4. Using readline.parse_and_bind for Advanced Bindings

You can use readline.parse_and_bind to bind custom key bindings, such as a command to execute a specific function:

import readline
import rlcompleter

# Set the completer function to use rlcompleter
readline.set_completer(rlcompleter.Completer().complete)

# Bind a custom key binding (e.g., Ctrl+X Ctrl+C)
readline.parse_and_bind('Control-X Control-C: exit')

def example_usage():
    print("Type 'exit' and press Ctrl+X Ctrl+C to quit.")
    while True:
        try:
            input_string = input()
            print(f"You entered: {input_string}")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

5. Completion for Specific Modules or Libraries

If you want to limit the completion to specific modules or libraries, you can override the _complete method to filter based on module contents:

import readline
import rlcompleter

class ModuleCompleter(rlcompleter.Completer):
    def complete(self, text, state):
        # Initialize custom_blacklist
        if not hasattr(self, 'custom_blacklist'):
            self.custom_blacklist = []
        # Define your own completion logic here
        matches = [item for item in dir(__builtins__) if item.startswith(text) and item not in self.custom_blacklist]
        return matches[state] if 0 <= state < len(matches) else None

# Set the custom completer function to use rlcompleter
readline.set_completer(ModuleCompleter().complete)

# Enable auto-completion
readline.parse_and_bind('tab: complete')

# Example usage of the module-specific completer
def example_usage():
    print("Type 'math.' and press 'Tab' for completion:")
    while True:
        try:
            input_string = input()
            obj = eval(input_string)
            if isinstance(obj, (int, float)):
                print(f"You selected: {obj}")
            else:
                print("Invalid object")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

6. Using readline.set_completer_delims to Customize Delimiters

You can customize the delimiters used by rlcompleter to affect how completion works:

import readline
import rlcompleter

# Set the completer function to use rlcompleter
completer = rlcompleter.Completer()
readline.set_completer(completer.complete)

# Customize delimiters
readline.set_completer_delims(' \t\n;:')

# Enable auto-completion
readline.parse_and_bind('tab: complete')

# Example usage of custom delimiters
def example_usage():
    print("Type a string and press 'Tab' for completion:")
    while True:
        try:
            input_string = input()
            print(f"You entered: {input_string}")
        except EOFError:
            print("\nExiting...")
            break

if __name__ == "__main__":
    example_usage()

These examples demonstrate how to use the rlcompleter module to enhance the interactive shell experience by providing auto-completion. Each example includes comments explaining key steps and functionalities, making it easy to understand and integrate into your own scripts.

stringprep - Internet String Preparation.md

stringprep - Internet String Preparation

The stringprep module is used for processing Unicode strings to prepare them for internationalization, especially for use in network protocols such as SMTP, LDAP, and IMAP4. It provides tools for normalizing Unicode characters according to specific rules defined by the Internationalized Domain Name (IDN) protocol and other relevant specifications.

Below are comprehensive examples of how to use each functionality provided by the stringprep module:

1. Normalization

Normalization is a crucial step in preparing strings for internationalization, ensuring that characters are represented consistently across different languages and regions.

import unicodedata

# Define a normalized string
normalized_string = unicodedata.normalize('NFKC', 'รกรฉรญรณรบ')

print(normalized_string)  # Output: aeiou

2. Check Character Properties

You can check if a character is suitable for use in certain contexts, such as handling hyphenation or punctuation.

# Check if a character is an uppercase letter
is_uppercase = 'A'.isupper()

print(is_uppercase)  # Output: True

# Check if a character is a digit
is_digit = '1'.isdigit()

print(is_digit)  # Output: True

3. Determine Character Type

You can determine the type of a character, such as whether it's a letter or a punctuation mark.

import unicodedata

# Check the category of a character
category = unicodedata.category('A')

print(category)  # Output: Lu (Letter, uppercase)

category = unicodedata.category('!')

print(category)  # Output: Po (Punctuation, other)

4. Process Unicode Tables

The stringprep module provides access to various tables that are used for normalization and validation.

import stringprep

# Access a specific table
table = stringprep.in_table_c11

# Check if a character is in the table
is_in_table = table('a')

print(is_in_table)  # Output: False

5. Generate Table Files

The stringprep module can generate tables based on input data or other tables.

import stringprep

# Example of using stringprep to check if a character is in a specific category
def is_in_table(char):
    return stringprep.in_table_a1(char)

# Print the result for a sample character
sample_char = 'A'
print(f'Is "{sample_char}" in table A1: {is_in_table(sample_char)}')

6. Validate Strings

You can validate strings against certain rules to ensure they are suitable for use in specific contexts.

import idna

# Validate a string according to the IDN protocol
try:
    idna.encode('xn--pwrq3d')
    is_idn_valid = True
except idna.IDNAError:
    is_idn_valid = False

print(is_idn_valid)  # Output: True

7. Example of Using stringprep in Practice

Here's an example of how you might use these features in a context like normalizing user input for display:

import idna
import unicodedata

# Check if a domain name is valid
try:
    idna.encode('example.com')
    is_domain_valid = True
except idna.IDNAError:
    is_domain_valid = False

print(is_domain_valid)  # Output: True

def normalize_user_input(input_string):
    normalized = unicodedata.normalize('NFKC', input_string)
    return normalized

# Example usage
user_input = "รกรฉรญรณรบ"
normalized_input = normalize_user_input(user_input)

print(f"Original: {user_input}")
print(f"Normalized: {normalized_input}")

8. Generating a Table for Validation

Suppose you want to generate a table that checks if certain characters are allowed in domain names.

import idna

# Check if a domain name is valid
try:
    idna.encode('example.com')
    is_domain_valid = True
except idna.IDNAError:
    is_domain_valid = False

print(is_domain_valid)  # Output: True

Conclusion

The stringprep module provides a robust set of tools for normalizing and validating Unicode strings, which are essential for internationalization in various network protocols. These examples demonstrate how to use each functionality effectively, providing clear documentation and example code for integration into larger projects.

textwrap - Text wrapping and filling.md

textwrap - Text wrapping and filling

Below is a comprehensive set of code examples that demonstrate various functionalities provided by the textwrap module in Python's standard library. The textwrap module provides utilities to format text in a variety of ways, such as filling and wrapping text.

# Importing the textwrap module
import textwrap

# 1. Basic Text Wrapping

# Example: Simple text wrapping


def simple_text_wrapping():
    """
    This example demonstrates basic text wrapping.
    The input string is wrapped to fit a specified width.
    """
    input_text = "This is an example of how the textwrap module can be used to wrap text."
    print("Original Text:")
    print(input_text)

    # Wrapping the text to 40 characters per line
    wrapped_text = textwrap.wrap(input_text, width=40)
    print("\nWrapped Text:")
    for line in wrapped_text:
        print(line)


simple_text_wrapping()

# 2. Filling Text

# Example: Filling with fill()


def fill_example():
    """
    This example demonstrates using the `fill()` function to wrap and fill text.
    The `fill()` method wraps the input text into a paragraph that fits within the specified width,
    while also indenting each line of the output by a specified number of spaces.
    """
    input_text = "This is an example of how the textwrap module can be used to wrap text."
    print("Original Text:")
    print(input_text)

    # Wrapping and filling the text with 40 characters per line, indented by 2 spaces
    filled_text = textwrap.fill(
        input_text, width=40, initial_indent="  ", subsequent_indent="  ")
    print("\nFilled Text:")
    print(filled_text)


fill_example()

# 3. Indentation

# Example: Indenting text


def indent_example():
    """
    This example demonstrates the use of `indent()` to add leading whitespace to each line of a paragraph.
    The `fill()` method is used first to wrap and fill the input text, then `indent()` is applied to add indentation.
    """
    input_text = "This is an example of how the textwrap module can be used to wrap text."
    print("Original Text:")
    print(input_text)

    # Wrapping and filling the text with 40 characters per line
    filled_text = textwrap.fill(input_text, width=40)

    # Adding 2 spaces of indentation to each line
    indented_text = textwrap.indent(filled_text, "  ")
    print("\nIndented Text:")
    print(indented_text)


indent_example()

# 4. Dedenting Text

# Example: Removing leading whitespace from text


def dedent_example():
    """
    This example demonstrates the use of `dedent()` to remove any common leading whitespace from each line.
    The input text should have consistent leading whitespace on all lines for this function to work correctly.
    """
    input_text = """  This is an example of how the textwrap module can be used to wrap text.
                    Notice that there are two spaces at the beginning of each line."""

    print("Original Text:")
    print(input_text)

    # Dedenting the text
    dedented_text = textwrap.dedent(input_text)
    print("\nDedented Text:")
    print(dedented_text)


dedent_example()

# 5. Processing Unicode Characters

# Example: Handling non-ASCII characters


def unicode_example():
    """
    This example demonstrates handling text containing non-ASCII characters.
    The `fill()` function is used to wrap and fill the input text, which includes emojis and other Unicode characters.
    """
    input_text = "This is an example of how the textwrap module can be used with text containing non-ASCII characters ๐Ÿ˜Š."
    print("Original Text:")
    print(input_text)

    # Wrapping and filling the text with 40 characters per line
    filled_text = textwrap.fill(input_text, width=40)
    print("\nFilled Text:")
    print(filled_text)


unicode_example()

Explanation:

  1. Simple Text Wrapping: Demonstrates how to wrap a given string to fit within a specified width.
  2. Filling Text: Uses fill() for wrapping and filling text, optionally indenting each line of the output.
  3. Indentation: Shows how to use indent() to add leading whitespace to a paragraph that has been wrapped and filled.
  4. Dedenting Text: Illustrates removing common leading whitespace using dedent().
  5. Processing Unicode Characters: Demonstrates handling text containing non-ASCII characters.

These examples provide a comprehensive overview of the functionalities available in the textwrap module, including handling different types of input and formatting options.

unicodedata - Unicode Database.md

unicodedata - Unicode Database

Below are comprehensive and well-documented code examples for the unicodedata module in Python, which provides access to a comprehensive database of Unicode characters.

Example 1: Retrieve Character Name

This example demonstrates how to retrieve the name of a character using its Unicode code point.

import unicodedata

# Define a Unicode code point
code_point = ord('A')

# Retrieve and print the character name
character_name = unicodedata.name(chr(code_point))
print(f"The name of character U+{code_point:04X} is {character_name}")

Example 2: Check Character Properties

This example checks if a character has specific properties like being an uppercase letter, lowercase letter, or digit.

import unicodedata

# Define a Unicode code point
code_point = ord('A')

# Check if the character is an uppercase letter
is_uppercase = unicodedata.category(chr(code_point)).startswith('Lu')
print(f"Character U+{code_point:04X} is uppercase: {is_uppercase}")

# Check if the character is a lowercase letter
is_lowercase = unicodedata.category(chr(code_point)).startswith('Ll')
print(f"Character U+{code_point:04X} is lowercase: {is_lowercase}")

# Check if the character is a digit
is_digit = unicodedata.category(chr(code_point)).startswith('Nd')
print(f"Character U+{code_point:04X} is a digit: {is_digit}")

Example 3: Normalize Text

This example demonstrates how to normalize text using different normalization forms provided by the unicodedata module.

import unicodedata

# Define some text with combining characters
text = "รฉclair"

# Normalize text to NFC (Canonical Decomposition followed by Canonical Composition)
nfc_normalized = unicodedata.normalize('NFC', text)
print(f"Normalized using NFC: {nfc_normalized}")

# Normalize text to NFD (Canonical Decomposition)
nfd_normalized = unicodedata.normalize('NFD', text)
print(f"Normalized using NFD: {nfd_normalized}")

# Normalize text to NFKC (Compatibility Decomposition followed by Canonical Composition)
nfkc_normalized = unicodedata.normalize('NFKC', text)
print(f"Normalized using NFKC: {nfkc_normalized}")

# Normalize text to NFKD (Compatibility Decomposition)
nfkd_normalized = unicodedata.normalize('NFKD', text)
print(f"Normalized using NFKD: {nfkd_normalized}")

Example 4: Extract Combining Characters

This example extracts combining characters from a given string.

import unicodedata

# Define a string with combining characters
text = "รฉclair"

# Extract and print combining characters
combining_characters = ''.join(
    chr(c) for c in range(0x300, 0x37F) if (
        unicodedata.category(chr(c)).startswith('Me') and unicodedata.decomposition(chr(c)) is not None
    )
)
print(f"Combining characters in '{text}': {combining_characters}")

Example 5: Convert Character to Emoji Sequence

This example demonstrates how to convert a character to its corresponding emoji sequence using the emoji module, which is often used alongside unicodedata.

pip install emoji

import unicodedata

# Define a Unicode code point for an emoji
code_point = ord('๐Ÿ˜Š')

# Get the character's name
character_name = unicodedata.name(chr(code_point))
print(f"Character U+{code_point:04X} is '{character_name}'")

# Convert to emoji sequence (assuming you have the `emoji` module installed)
import emoji

emoji_sequence = emoji.emojize(character_name)
print(f"Emoji sequence for {character_name}: {emoji_sequence}")

Example 6: Check Character Bidirectional Properties

This example checks if a character has bidirectional properties like being left-to-right, right-to-left, or neutral.

import unicodedata

# Define a Unicode code point
code_point = ord('A')

# Check bidirectional property
is_left_to_right = unicodedata.bidirectional(chr(code_point)) == 'L'
print(f"Character U+{code_point:04X} is left-to-right: {is_left_to_right}")

is_right_to_left = unicodedata.bidirectional(chr(code_point)) == 'R'
print(f"Character U+{code_point:04X} is right-to-left: {is_right_to_left}")

is_neutral = unicodedata.bidirectional(chr(code_point)) in ('LRE', 'LRO', 'PDF', 'NSM', 'AL')
print(f"Character U+{code_point:04X} is neutral: {is_neutral}")

These examples cover a range of functionalities provided by the unicodedata module, including retrieving character names, checking properties, normalizing text, extracting combining characters, converting to emoji sequences, and checking bidirectional properties.

Unix Specific Services

crypt - Function to check Unix passwords.md

crypt - Function to check Unix passwords

The crypt module in Python is used to provide an interface to Unix-style password hashing functions, which are commonly found in systems like Linux. This module includes a function called checkpw() that can be used to verify whether a given password matches the hashed form of a stored password.

Here's a comprehensive example demonstrating how to use the crypt module to check passwords:

import crypt

def check_password(stored_hash, plain_text_password):
    """
    Check if the provided plain text password matches the stored hash using the crypt function.

    Parameters:
    - stored_hash (str): The hashed password as a string.
    - plain_text_password (str): The plain text password to verify.

    Returns:
    - bool: True if the password matches the stored hash, False otherwise.
    """
    # Generate a salt for hashing
    salt = crypt.mksalt()

    # Create a password hash using the provided salt and plain text password
    hashed_password = crypt.crypt(plain_text_password, salt)

    # Check if the generated hash matches the stored hash
    return hashed_password == stored_hash

# Example usage of the check_password function
if __name__ == "__main__":
    # Example stored password (hashed using crypt.ENC_MD5)
    stored_md5_hash = "$1$u7093lQf$aWJy8sVdLZvKgUxNQzY"

    # Plain text password to verify
    plain_text_password = "password123"

    # Check if the provided password matches the stored hash
    result = check_password(stored_md5_hash, plain_text_password)

    # Print the result
    print(f"Password verification: {'Success' if result else 'Failure'}")

Explanation:

  1. Import the crypt Module: The crypt module provides access to Unix-style password hashing functions.

  2. Function Definition: The check_password() function takes two parameters:

  3. stored_hash: The hashed password as a string.
  4. plain_text_password: The plain text password to verify.

  5. Generate Salt: A salt is generated using crypt.mksalt(). This ensures that each password hash is unique, even if the same password is used in different environments.

  6. Hash Password: Using the generated salt and the plain text password, a new password hash is created with crypt.crypt().

  7. Comparison: The function compares the generated hash with the stored hash to determine if they match.

  8. Example Usage: In the example usage section, we demonstrate how to use the check_password function to verify a password against a stored hash using the MD5 algorithm (crypt.ENC_MD5). You can replace the salt and hashing method with others available in Python's crypt module (e.g., crypt.ENC_BLOWFISH, crypt.ENC_SHA256) depending on your requirements.

This example is suitable for use in applications where password verification is necessary, such as user authentication systems or secure data storage solutions.

fcntl - The fcntl and ioctl system calls.md

fcntl - The fcntl and ioctl system calls

The fcntl module in Python provides a way to manipulate file descriptor properties using the fcntl system call, which is part of the POSIX API. This module allows you to perform operations on file descriptors such as locking, non-blocking I/O, and more.

Here are some comprehensive code examples for each functionality provided by the fcntl module:

1. Locking a File

import fcntl
import os

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Define lock flags (e.g., LOCK_EX for exclusive lock)
flags = fcntl.LOCK_EX | fcntl.LOCK_NB  # Non-blocking exclusive lock

try:
    # Apply the lock to the file descriptor
    fcntl.flock(fd, flags)

    print("File is locked.")
except BlockingIOError:
    print("Lock could not be acquired due to non-blocking flag.")

# Release the lock when done
fcntl.flock(fd, fcntl.LOCK_UN)
fd.close()

2. Non-blocking I/O

import os
import fcntl

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Set non-blocking mode using fcntl
flags = os.O_NONBLOCK
fcntl.fcntl(fd, fcntl.F_SETFL, flags)

try:
    # Attempt to read from the file without blocking
    data = fd.read(10)
    print(f"Data read: {data.decode()}")
except BlockingIOError:
    print("Reading from the file would block.")

# Close the file
fd.close()

3. Changing File Descriptor Properties

import fcntl
import os

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Get the current flags for the file descriptor
flags = fcntl.fcntl(fd, fcntl.F_GETFL)

print(f"Current flags: {flags}")

# Set a new flag (e.g., O_APPEND)
new_flags = flags | os.O_APPEND

# Apply the new flags to the file descriptor
fcntl.fcntl(fd, fcntl.F_SETFL, new_flags)

print("File descriptor flags updated.")

# Close the file
fd.close()

4. Using ioctl for Device Control

import fcntl
import struct

# Open a device file
fd = open('/dev/ttyS0', 'r+')

# Define the ioctl command and argument (e.g., TIOCGSERIAL for serial port settings)
command = 0x80003F2C  # Example IOCTL command for getting serial port settings
arg = struct.pack('h', 9600)  # Example baud rate

try:
    # Perform the ioctl call
    result = fcntl.ioctl(fd, command, arg)
    print(f"Serial port settings: {result}")
except OSError as e:
    print(f"ioctl failed with error: {e}")

# Close the file
fd.close()

5. Setting File Descriptor Options

import fcntl
import os

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Define options to set (e.g., O_DSYNC for data synchronization)
options = os.O_DSYNC

# Apply the options to the file descriptor
fcntl.fcntl(fd, fcntl.F_SETFD, options)

print("File descriptor options updated.")

# Close the file
fd.close()

6. Getting File Descriptor Attributes

import fcntl

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Get the file status using F_GETSTAT
stat_buf = fcntl.fstat(fd)

print(f"File size: {stat_buf.st_size} bytes")

# Close the file
fd.close()

7. Getting File Descriptor Information

import fcntl

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Get the file descriptor information using F_GETFD
flags = fcntl.fcntl(fd, fcntl.F_GETFD)

print(f"File descriptor flags: {flags}")

# Close the file
fd.close()

8. Getting File Descriptor Lock Information

import fcntl

# Open a file in read-only mode
fd = open('example.txt', 'r')

# Get the lock information using F_GETLK
lock_info = struct.pack('llll', 0, 0, 0, 0)  # Format: start, length, pid, type
fcntl.fcntl(fd, fcntl.F_GETLK, lock_info)

print(f"Lock information: {lock_info}")

# Close the file
fd.close()

These examples demonstrate various uses of the fcntl module to manipulate file descriptors and perform operations that are typically handled by lower-level system calls. Each example includes comments explaining the purpose and functionality of each code snippet, making it easy to understand and integrate into larger applications or documentation.

grp - The group database.md

grp - The group database

Below are comprehensive code examples for the grp module in Python, which provides access to the system's group database. Each example is well-documented and follows best practices.

import grp

# 1. Retrieve all groups
def list_all_groups():
    """
    List all groups available on the system.

    Returns:
        list: A list of group entries.
    """
    try:
        # Use grp.getgrall() to get a list of all groups
        all_groups = grp.getgrall()

        for group in all_groups:
            print(f"Group Name: {group.gr_name}")
            print(f"Group ID: {group.gr_gid}")
            print(f"Password: {group.gr_passwd}")
            print(f"Members: {group.gr_mem}")
            print("-" * 40)

    except Exception as e:
        print(f"Error retrieving groups: {e}")

# 2. Retrieve information about a specific group by name
def get_group_by_name(group_name):
    """
    Get information about a group by its name.

    Args:
        group_name (str): The name of the group.

    Returns:
        grp.struct_group or None: Group entry if found, otherwise None.
    """
    try:
        # Use grp.getgrnam() to get the group by name
        group = grp.getgrnam(group_name)
        print(f"Group Name: {group.gr_name}")
        print(f"Group ID: {group.gr_gid}")
        print(f"Password: {group.gr_passwd}")
        print(f"Members: {group.gr_mem}")

    except KeyError:
        print(f"Group '{group_name}' not found.")

    except Exception as e:
        print(f"Error retrieving group by name: {e}")

# 3. Retrieve information about a specific group by ID
def get_group_by_gid(group_id):
    """
    Get information about a group by its ID.

    Args:
        group_id (int): The ID of the group.

    Returns:
        grp.struct_group or None: Group entry if found, otherwise None.
    """
    try:
        # Use grp.getgrgid() to get the group by ID
        group = grp.getgrgid(group_id)
        print(f"Group Name: {group.gr_name}")
        print(f"Group ID: {group.gr_gid}")
        print(f"Password: {group.gr_passwd}")
        print(f"Members: {group.gr_mem}")

    except KeyError:
        print(f"Group with ID '{group_id}' not found.")

    except Exception as e:
        print(f"Error retrieving group by ID: {e}")

# 4. Add a new group (requires superuser privileges)
def add_group(group_name, password, gid=None):
    """
    Add a new group to the system.

    Args:
        group_name (str): The name of the group to add.
        password (str): The password for the group (usually set to None).
        gid (int, optional): The GID for the group. Defaults to the next available GID.

    Returns:
        str: A message indicating success or failure.
    """
    try:
        # Use grp.addgrpg() to add a new group
        if gid is None:
            # Automatically allocate a new GID
            gid = grp.getgrent().gr_gid + 1

        grp.addgroup(group_name, password, gid)
        print(f"Group '{group_name}' added with GID {gid}.")

    except KeyError:
        print("Failed to add group due to permission issues.")

    except Exception as e:
        print(f"Error adding group: {e}")

# 5. Modify an existing group
def modify_group(group_name, new_members):
    """
    Modify an existing group by updating its members.

    Args:
        group_name (str): The name of the group to modify.
        new_members (list): A list of new member usernames.

    Returns:
        str: A message indicating success or failure.
    """
    try:
        # Get the group entry
        group = grp.getgrnam(group_name)

        # Update the members
        new_group = grp.struct_group(
            gr_name=group.gr_name,
            gr_gid=group.gr_gid,
            gr_passwd=group.gr_passwd,
            gr_mem=new_members
        )

        # Use grp.setgrnam() to update the group entry
        grp.setgrent()
        grp.putgr(new_group)
        grp.endgrent()

        print(f"Group '{group_name}' members updated.")

    except KeyError:
        print("Failed to modify group due to permission issues.")

    except Exception as e:
        print(f"Error modifying group: {e}")

# 6. Remove a group
def remove_group(group_name):
    """
    Remove an existing group from the system.

    Args:
        group_name (str): The name of the group to remove.

    Returns:
        str: A message indicating success or failure.
    """
    try:
        # Get the group entry
        group = grp.getgrnam(group_name)

        # Use grp.removename() to delete the group
        grp.removename(group.gr_name, group.gr_gid)

        print(f"Group '{group_name}' removed.")

    except KeyError:
        print("Failed to remove group due to permission issues.")

    except Exception as e:
        print(f"Error removing group: {e}")

# Example usage
if __name__ == "__main__":
    list_all_groups()

    get_group_by_name("root")
    get_group_by_gid(0)

    add_group("newgroup", "password", gid=1000)

    modify_group("newgroup", ["user1", "user2"])

    remove_group("newgroup")

Explanation:

These examples demonstrate how to interact with the grp module effectively, covering various operations such as listing groups, retrieving group information, adding and modifying groups, and removing them.

nis - Interface to Sun s NIS (Yellow Pages).md

nis - Interface to Sunโ€™s NIS (Yellow Pages)

The nis module is an interface to Sun Microsystems' Yellow Pages (NIS) services, which were used to manage network information systems in Unix-like operating systems. While Python's support for NIS has been limited and deprecated in recent versions of the standard library due to its complexity and lack of modern alternatives like LDAP or Active Directory, I can still provide a basic example of how you might use the nis module if you need to interact with an NIS server.

Here's a comprehensive code example that demonstrates some common operations using the nis module:

import nis

def main():
    # Define the domain and service for which you want to access information
    domain = 'example.com'
    service = 'passwd.byname'

    try:
        # Retrieve NIS information
        info = nis.niscat(domain, service)

        print(f"Domain: {domain}")
        print(f"Service: {service}")

        # Iterate over the entries and print them
        for entry in info:
            print(entry)

    except nis.error as e:
        # Handle errors that occur during NIS operations
        print(f"Error accessing NIS: {e}")

if __name__ == "__main__":
    main()

Explanation:

  1. Import the nis Module: This module provides functions to interact with NIS services.

  2. Define Domain and Service: Specify the domain and service you want to access, such as /etc/passwd.byname.

  3. Retrieve NIS Information: Use nis.niscat() to retrieve data from the specified NIS server and service. This function returns a list of entries in the format [key1, value1], [key2, value2], ....

  4. Handle Exceptions: Use a try-except block to handle any errors that may occur during the operation, such as connection issues or permission problems.

  5. Iterate and Print Entries: Loop through the retrieved entries and print them out.

Notes:

This example provides a basic framework for interacting with NIS services. Depending on your specific requirements, you might need to extend this code to handle more complex scenarios or integrate it into a larger application.

pipes - Interface to shell pipelines.md

pipes - Interface to shell pipelines

Below are comprehensive code examples for the pipes module in Python 3.12, along with explanations of each example:

Example 1: Basic Pipelines

import subprocess

# Create a pipe and connect it to a command
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)

# Read from the process's stdout
output, error = process.communicate()

# Decode the output from bytes to string
result = output.decode('utf-8')

print("Output:")
print(result)

Explanation: This example demonstrates how to use the subprocess module to create a simple pipeline. It runs the ls -l command and captures its output. The stdout=subprocess.PIPE argument sets up the pipe, and communicate() reads from the process's standard output.

Example 2: Multiple Commands in a Pipeline

import subprocess

# Create a pipeline with two commands
process1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
process2 = subprocess.Popen(['grep', 'lib'], stdin=process1.stdout, stdout=subprocess.PIPE)

# Read from the second process's stdout
output, error = process2.communicate()

# Decode the output from bytes to string
result = output.decode('utf-8')

print("Output:")
print(result)

Explanation: This example shows how to create a more complex pipeline by connecting the standard output of one command to the input of another. The grep command filters lines containing "lib" based on the output from ls -l.

Example 3: Redirecting Standard Input

import subprocess

# Create a pipe and connect it to a command with input redirection
process = subprocess.Popen(['echo', 'Hello, World!'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# Write to the process's stdin and read from stdout
output, error = process.communicate(input=b'Input for echo\n')

# Decode the output from bytes to string
result = output.decode('utf-8')

print("Output:")
print(result)

Explanation: This example demonstrates how to use a pipe to redirect input to a command. The echo command is used to print "Hello, World!", and the input redirection is set up using stdin=subprocess.PIPE.

Example 4: Handling Errors

import subprocess

# Create a pipe and connect it to a command with error handling
process = subprocess.Popen(['ls', 'nonexistentfile'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

output, error = process.communicate()

if process.returncode == 0:
    result = output.decode('utf-8')
    print("Output:")
    print(result)
else:
    error_message = error.decode('utf-8')
    print("Error:")
    print(error_message)

Explanation: This example shows how to handle errors by checking the return code of the process. It attempts to list a non-existent file and prints an error message if the operation fails.

Example 5: Using subprocess.run()

import subprocess

# Create a pipe and connect it to a command using subprocess.run()
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, check=True)

# Decode the output from bytes to string
output = result.stdout.decode('utf-8')

print("Output:")
print(output)

Explanation: This example demonstrates how to use subprocess.run(), which provides a more user-friendly interface for running commands. The check=True argument ensures that a CalledProcessError is raised if the command returns a non-zero exit status.

Example 6: Using subprocess.Popen() with Multiple Arguments

import subprocess

# Create a pipe and connect it to a command with multiple arguments
process = subprocess.Popen(['echo', 'Hello,', '"World!"'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# Read from the process's stdout and stderr
output, error = process.communicate()

# Decode the output and error from bytes to string
result = output.decode('utf-8')
error_message = error.decode('utf-8')

print("Output:")
print(result)
print("\nError:")
print(error_message)

Explanation: This example shows how to use subprocess.Popen() with multiple arguments, including a quoted string, which is useful for handling special characters or strings with spaces.

These examples cover basic and advanced uses of the pipes module, demonstrating how to create and manage pipelines in Python using subprocesses.

posix - The most common POSIX system calls.md

posix - The most common POSIX system calls

The posix module in Python is not a built-in module like many others in the standard library, but rather a collection of functions that provide access to system calls on Unix-like operating systems. However, it's important to note that direct interaction with POSIX system calls using this module is generally discouraged due to compatibility issues and lack of support for more recent versions of POSIX standards.

Instead, Python provides more modern interfaces like the os module and its submodules such as os.path, os.system, subprocess, and shutil. These provide a higher-level interface to operating system services and are recommended for general use.

If you need to interact with POSIX system calls directly, you would typically use platform-specific libraries or write wrappers in C/C++ and compile them into Python extensions using tools like SWIG. However, this approach is not covered by the standard library module posix.

Here's a brief overview of what the posix module contains, along with some conceptual examples:

Conceptual Examples

Example 1: Accessing POSIX Environment Variables

You can access environment variables in Python using the os.getenv() function.

import os

# Get the value of an environment variable
username = os.getenv('USER')
print(f"Username: {username}")

# Set a new environment variable
os.environ['NEW_VAR'] = 'new_value'

Example 2: Changing the Current Working Directory

You can change the current working directory using os.chdir().

import os

# Get the current working directory
current_directory = os.getcwd()
print(f"Current Directory: {current_directory}")

# Change to a new directory
new_directory = '/path/to/new/directory'
try:
    os.chdir(new_directory)
except FileNotFoundError:
    print(f"Error: The directory '{new_directory}' does not exist.")

Example 3: Executing System Commands

You can execute system commands using os.system(). This function runs the command and waits for it to complete.

import os

# Run a system command
result = os.system('ls -l')
print(result)  # Output will depend on the command executed

Example 4: Managing File Descriptors

You can manage file descriptors using os.dup(), os.fdopen(), and os.close().

import os

try:
    # Duplicate a file descriptor
    original_fd = open('file.txt', 'r')
    duplicated_fd = os.dup(original_fd.fileno())

    # Open a new file descriptor to the same file
    new_file = os.fdopen(duplicated_fd, 'w')

    # Write to the new file
    new_file.write('Hello, world!')
except OSError as e:
    print(f"OS error: {e}")
except IOError as e:
    print(f"I/O error: {e}")
finally:
    # Close the original and duplicated file descriptors
    try:
        original_fd.close()
    except NameError:
        pass
    try:
        os.close(duplicated_fd)
    except NameError:
        pass
    except OSError as e:
        print(f"Error closing duplicated file descriptor: {e}")

Example 5: Using subprocess for More Complex Command Execution

The subprocess module provides a more robust way to execute system commands and capture their output.

import subprocess

# Run a command and capture its output
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print("Command Output:")
print(result.stdout)

# Check the return code of the command
if result.returncode == 0:
    print("Command executed successfully.")
else:
    print(f"Command failed with exit code {result.returncode}")

Example 6: Using os.path for File Path Manipulation

The os.path module provides functions to manipulate file paths.

import os

# Construct a path
path = os.path.join('folder', 'file.txt')
print("Constructed Path:", path)

# Split a path into components
directory, filename = os.path.split(path)
print(f"Directory: {directory}, Filename: {filename}")

# Check if a path is absolute
is_absolute = os.path.isabs(path)
print(f"Is Absolute: {is_absolute}")

Conclusion

While the posix module in Python provides access to some basic POSIX system calls, it's recommended to use higher-level interfaces like os, subprocess, and shutil for most tasks. These modules offer better abstraction and compatibility with modern operating systems. If you need direct access to POSIX system calls, consider using platform-specific libraries or compiling C/C++ extensions.

pty - Pseudo-terminal utilities.md

pty - Pseudo-terminal utilities

The pty module in Python provides a way to create pseudoterminal (pseudo-TTY) devices, which are used to simulate a terminal environment in applications that need console input/output. This is particularly useful for creating interactive programs or services that require real-time access to the user's console.

Here are comprehensive examples for various functionalities of the pty module:

Example 1: Simple Pseudoterminal Creation and Usage

import pty
import os

# Define a callback function to handle input/output from the pseudo-terminal
def process_input(data):
    print(f"Received data: {data.decode()}")
    return "Processed Output"

# Open a pseudoterminal
master_fd, slave_fd = pty.openpty()

try:
    # Create a new process using os.fork()
    pid = os.fork()

    if pid == 0:
        # Child process: replace the terminal with the pseudo-terminal
        os.setsid()
        os.execvp('bash', ['bash'])
    else:
        # Parent process: communicate with the child through the pseudo-terminal
        while True:
            # Read data from the pseudo-terminal
            input_data = os.read(master_fd, 1024)

            if not input_data:
                break

            # Process the input and send the output back to the pseudo-terminal
            processed_output = process_input(input_data)
            os.write(master_fd, processed_output.encode())
finally:
    # Ensure the pseudoterminal is closed after usage
    os.close(master_fd)

Example 2: Using pty.spawn for Simple Process Execution

The pty.spawn function is a convenience wrapper that opens a pseudo-terminal and runs a specified command in it.

import pty
import os

# Define a callback function to handle input/output from the pseudo-terminal
def process_input(data):
    print(f"Received data: {data.decode()}")
    return "Processed Output"

# Open a pseudoterminal
master_fd, slave_fd = pty.openpty()

try:
    # Use pty.spawn to execute 'bash' in the pseudo-terminal
    pid = pty.spawn('bash', stdin=slave_fd, stdout=slave_fd, stderr=slave_fd)

    if pid == 0:
        # Child process: replace the terminal with the pseudo-terminal
        os.setsid()
        os.execvp('bash', ['bash'])
    else:
        # Parent process: communicate with the child through the pseudo-terminal
        while True:
            # Read data from the pseudo-terminal
            input_data = os.read(master_fd, 1024)

            if not input_data:
                break

            # Process the input and send the output back to the pseudo-terminal
            processed_output = process_input(input_data)
            os.write(master_fd, processed_output.encode())
finally:
    # Ensure the pseudoterminal is closed after usage
    os.close(master_fd)

Example 3: Reading Output from a Pseudoterminal

This example shows how to read output from the pseudo-terminal without blocking.

import pty
import os

# Open a pseudoterminal
master_fd, slave_fd = pty.openpty()

try:
    # Use pty.spawn to execute 'sleep 5' in the pseudo-terminal
    pid = pty.spawn('sleep', '5', stdin=slave_fd, stdout=slave_fd, stderr=slave_fd)

    if pid == 0:
        # Child process: replace the terminal with the pseudo-terminal
        os.setsid()
        os.execvp('sleep', ['sleep', '5'])
    else:
        # Parent process: read output from the pseudo-terminal without blocking
        while True:
            try:
                # Read data from the pseudo-terminal
                input_data = os.read(master_fd, 1024)

                if not input_data:
                    break

                print(f"Received output: {input_data.decode()}")
            except OSError as e:
                if e.errno == errno.EAGAIN:
                    continue
                else:
                    raise

finally:
    # Ensure the pseudoterminal is closed after usage
    os.close(master_fd)

Example 4: Handling Input with pty.master_read and pty.master_write

This example demonstrates how to manually read and write data to a pseudo-terminal.

import pty
import os

# Open a pseudoterminal
master_fd, slave_fd = pty.openpty()

try:
    # Use pty.spawn to execute 'sleep 5' in the pseudo-terminal
    pid = pty.spawn('sleep', '5', stdin=slave_fd, stdout=slave_fd, stderr=slave_fd)

    if pid == 0:
        # Child process: replace the terminal with the pseudo-terminal
        os.setsid()
        os.execvp('sleep', ['sleep', '5'])
    else:
        # Parent process: manually read and write data to the pseudo-terminal
        while True:
            try:
                # Read input from the user
                user_input = input("Enter command: ")

                if user_input == "exit":
                    break

                # Write the user's input to the pseudo-terminal
                os.write(master_fd, user_input.encode())

                # Read output from the pseudo-terminal
                output = os.read(master_fd, 1024)

                if not output:
                    continue

                print(f"Output: {output.decode()}")
            except KeyboardInterrupt:
                break

finally:
    # Ensure the pseudoterminal is closed after usage
    os.close(master_fd)

Example 5: Using pty.fork for a Child Process with Pseudo-terminal

This example shows how to create a child process using pty.fork and handle input/output through a pseudo-terminal.

import pty
import os

# Define a callback function to handle input/output from the pseudo-terminal
def process_input(data):
    print(f"Received data: {data.decode()}")
    return "Processed Output"

# Open a pseudoterminal
master_fd, slave_fd = pty.openpty()

try:
    # Fork a new process
    pid = os.fork()

    if pid == 0:
        # Child process: replace the terminal with the pseudo-terminal
        os.setsid()
        os.dup2(slave_fd, 0)
        os.dup2(slave_fd, 1)
        os.dup2(slave_fd, 2)
        os.close(master_fd)
        os.execvp('bash', ['bash'])
    else:
        # Parent process: communicate with the child through the pseudo-terminal
        while True:
            try:
                # Read input from the user
                user_input = input("Enter command: ")

                if user_input == "exit":
                    break

                # Write the user's input to the pseudo-terminal
                os.write(master_fd, user_input.encode())

                # Read output from the pseudo-terminal
                output = os.read(master_fd, 1024)

                if not output:
                    continue

                print(f"Output: {output.decode()}")
            except KeyboardInterrupt:
                break

finally:
    # Ensure the pseudoterminal is closed after usage
    os.close(master_fd)

These examples cover various aspects of using the pty module, from simple terminal simulation to more complex processes involving input/output handling.

pwd - The password database.md

pwd - The password database

The pwd module in Python provides an interface to the system's password database, which contains user account information such as usernames, passwords, home directories, and shell programs.

Below are comprehensive code examples demonstrating various functionalities of the pwd module:

1. Getting a Password Database Entry by Username

import pwd

# Example: Get the password entry for a specific username
username = 'example_user'
try:
    pwd_entry = pwd.getpwnam(username)
    print(f"User {username} found:")
    print(f"Username: {pwd_entry.pw_name}")
    print(f"Password Hash: {pwd_entry.pw_passwd}")
    print(f"UID: {pwd_entry.pw_uid}")
    print(f"GID: {pwd_entry.pw_gid}")
    print(f"Home Directory: {pwd_entry.pw_dir}")
    print(f"Shell Program: {pwd_entry.pw_shell}")
except KeyError:
    print(f"User {username} not found.")

2. Getting a Password Database Entry by UID

import pwd

# Example: Get the password entry for a specific UID
uid = 1001
try:
    pwd_entry = pwd.getpwuid(uid)
    print(f"User with UID {uid} found:")
    print(f"Username: {pwd_entry.pw_name}")
    print(f"Password Hash: {pwd_entry.pw_passwd}")
    print(f"UID: {pwd_entry.pw_uid}")
    print(f"GID: {pwd_entry.pw_gid}")
    print(f"Home Directory: {pwd_entry.pw_dir}")
    print(f"Shell Program: {pwd_entry.pw_shell}")
except KeyError:
    print(f"No user found with UID {uid}.")

3. Listing All Users

import pwd

# Example: List all users in the system
for user_info in pwd.getpwall():
    print(f"Username: {user_info.pw_name}, UID: {user_info.pw_uid}")

4. Retrieving Group Information for a User

import grp

# Example: Get the group information for a specific username
username = 'example_user'
try:
    user_entry = pwd.getpwnam(username)
    group_id = user_entry.pw_gid
    group_info = grp.getgrgid(group_id)
    print(f"User {username} belongs to group:")
    print(f"Group Name: {group_info.gr_name}")
    print(f"Group ID: {group_info.gr_gid}")
    print(f"Group Members: {', '.join(group_info.gr_mem)}")
except KeyError:
    print(f"User {username} not found.")

5. Listing All Groups

import grp

# Example: List all groups in the system
for group_info in grp.getgrall():
    print(f"Group Name: {group_info.gr_name}, Group ID: {group_info.gr_gid}")

6. Retrieving User Information Using os Module

import os
import pwd

# Example: Get user information using os.getpwuid()
username = 'example_user'
try:
    user_id = os.getuid()
    user_entry = pwd.getpwuid(user_id)
    print(f"Current user {pwd.getlogin()} found:")
    print(f"Username: {user_entry.pw_name}")
    print(f"Password Hash: {user_entry.pw_passwd}")
    print(f"UID: {user_entry.pw_uid}")
    print(f"GID: {user_entry.pw_gid}")
    print(f"Home Directory: {user_entry.pw_dir}")
    print(f"Shell Program: {user_entry.pw_shell}")
except KeyError:
    print("No user information available.")

7. Changing the Shell of a User

import pwd
import os

# Example: Change the shell for a specific user
username = 'example_user'
shell_path = '/bin/bash'
try:
    user_entry = pwd.getpwnam(username)
    # Check if the new shell exists
    if os.path.exists(shell_path):
        print(f"Changing shell for {username} to {shell_path}.")
        user_entry.pw_shell = shell_path
        pwd.setpwent()
        try:
            pwd.putpwent(user_entry)
            pwd.endpwent()
            print("Shell changed successfully.")
        except PermissionError:
            print("Permission denied to change the shell.")
    else:
        print(f"The specified shell {shell_path} does not exist.")
except KeyError:
    print(f"User {username} not found.")

8. Retrieving User and Group Information Using getpass Module

import getpass

# Example: Retrieve user information using getpass.getuser()
print(f"The current user is: {getpass.getuser()}")

# Example: Retrieve group information for the current user
username = getpass.getuser()
try:
    user_entry = pwd.getpwnam(username)
    print(f"Current user's group is:")
    group_info = grp.getgrgid(user_entry.pw_gid)
    print(f"Group Name: {group_info.gr_name}")
    print(f"Group ID: {group_info.gr_gid}")
    print(f"Group Members: {', '.join(group_info.gr_mem)}")
except KeyError:
    print("No user information available.")

9. Listing All Users and Their Groups

import pwd
import grp

# Example: List all users and their groups
for user_info in pwd.getpwall():
    username = user_info.pw_name
    try:
        group_info = grp.getgrgid(user_info.pw_gid)
        print(f"User {username} belongs to group(s):")
        for member in group_info.gr_mem:
            print(member)
    except KeyError:
        print(f"No information available for user {username}.")

10. Changing the Password of a User

import pwd
import crypt
import os

# Example: Change the password for a specific user (requires superuser privileges)
username = 'example_user'
new_password = 'securepassword'

try:
    user_entry = pwd.getpwnam(username)
    # Check if the new password meets complexity requirements
    if len(new_password) >= 8 and any(char.isdigit() for char in new_password):
        print(f"Changing password for {username}.")

        # Hash the new password
        salt = os.urandom(2).hex()
        hashed_password = crypt.crypt(new_password, f'$6${salt}')

        user_entry.pw_passwd = hashed_password

        pwd.setpwent()
        try:
            pwd.putpwent(user_entry)
            pwd.endpwent()
            print("Password changed successfully.")
        except PermissionError:
            print("Permission denied to change the password.")
    else:
        print("The new password must be at least 8 characters long and contain at least one digit.")
except KeyError:
    print(f"User {username} not found.")

Notes:

These examples cover a range of functionalities available in the pwd module, providing clear and concise code that can be used as documentation or reference material.

resource - Resource usage information.md

resource - Resource usage information

The resource module in Python provides a portable interface to system resources. It allows you to monitor and control various aspects of program execution, such as memory limits, CPU time, open file descriptors, etc.

Here are comprehensive code examples that demonstrate the functionalities of the resource module:

Example 1: Monitoring Memory Usage

This example demonstrates how to monitor the current memory usage of a process.

import resource

def monitor_memory_usage():
    # Get the current peak memory usage in kilobytes
    peak_memory_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024.0

    print(f"Peak Memory Usage: {peak_memory_usage} MB")

if __name__ == "__main__":
    monitor_memory_usage()

Example 2: Setting CPU Time Limits

This example shows how to set a limit on the CPU time that a process can use.

import resource

def set_cpu_time_limit(seconds):
    try:
        # Set the soft and hard limits for CPU time (in seconds)
        resource.setrlimit(resource.RLIMIT_CPU, (seconds, -1))
        print(f"CPU Time Limit Set: {seconds} seconds")
    except OSError as e:
        print(f"Failed to set CPU time limit: {e}")

if __name__ == "__main__":
    set_cpu_time_limit(10)  # Set a 10-second CPU time limit

Example 3: Monitoring File Descriptor Limits

This example shows how to monitor and set limits on the number of file descriptors a process can open.

import resource

def get_file_descriptor_limits():
    try:
        # Get the current soft and hard limits for file descriptors
        soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)

        print(f"Current File Descriptor Limits: Soft {soft_limit}, Hard {hard_limit}")
    except OSError as e:
        print(f"Failed to get file descriptor limits: {e}")

def set_file_descriptor_limits(soft_limit, hard_limit):
    try:
        # Set the soft and hard limits for file descriptors
        resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))
        print(f"File Descriptor Limits Set: Soft {soft_limit}, Hard {hard_limit}")
    except OSError as e:
        print(f"Failed to set file descriptor limits: {e}")

if __name__ == "__main__":
    get_file_descriptor_limits()
    set_file_descriptor_limits(256, 1024)

Example 4: Monitoring Memory Limits

This example demonstrates how to monitor and set memory limits for a process.

import resource

def get_memory_limits():
    try:
        # Get the current soft and hard limits for memory usage (in bytes)
        soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_AS)

        print(f"Current Memory Limits: Soft {soft_limit} bytes, Hard {hard_limit} bytes")
    except OSError as e:
        print(f"Failed to get memory limits: {e}")

def set_memory_limits(soft_limit, hard_limit):
    try:
        # Set the soft and hard limits for memory usage (in bytes)
        resource.setrlimit(resource.RLIMIT_AS, (soft_limit, hard_limit))
        print(f"Memory Limits Set: Soft {soft_limit} bytes, Hard {hard_limit} bytes")
    except OSError as e:
        print(f"Failed to set memory limits: {e}")

if __name__ == "__main__":
    get_memory_limits()
    set_memory_limits(1024 * 1024 * 512, -1)  # Set a 512MB soft limit and no hard limit

Example 5: Monitoring CPU Usage

This example demonstrates how to monitor the current CPU usage of a process.

import resource

def get_cpu_usage():
    try:
        # Get the current user and system CPU time used by the process (in seconds)
        user_time, sys_time = resource.getrusage(resource.RUSAGE_SELF).ru_utime + resource.getrusage(resource.RUSAGE_SELF).ru_stime

        print(f"CPU Usage: User {user_time} seconds, System {sys_time} seconds")
    except OSError as e:
        print(f"Failed to get CPU usage: {e}")

if __name__ == "__main__":
    get_cpu_usage()

Example 6: Monitoring Maximum File Descriptor Usage

This example demonstrates how to monitor and set the maximum number of open files a process can have.

import resource

def get_max_open_files():
    try:
        # Get the current hard limit for the maximum number of open files
        max_open_files = resource.getrlimit(resource.RLIMIT_NOFILE)[1]

        print(f"Maximum Open Files Limit: {max_open_files}")
    except OSError as e:
        print(f"Failed to get maximum open files limit: {e}")

def set_max_open_files(max_open_files):
    try:
        # Set the hard limit for the maximum number of open files
        resource.setrlimit(resource.RLIMIT_NOFILE, (resource.getrlimit(resource.RLIMIT_NOFILE)[0], max_open_files))
        print(f"Maximum Open Files Limit Set: {max_open_files}")
    except OSError as e:
        print(f"Failed to set maximum open files limit: {e}")

if __name__ == "__main__":
    get_max_open_files()
    set_max_open_files(1024)

Example 7: Monitoring Maximum Stack Size

This example demonstrates how to monitor and set the maximum stack size a process can use.

import resource

def get_stack_size():
    try:
        # Get the current soft and hard limits for the maximum stack size (in bytes)
        soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_STACK)

        print(f"Stack Size Limits: Soft {soft_limit} bytes, Hard {hard_limit} bytes")
    except OSError as e:
        print(f"Failed to get stack size limits: {e}")

def set_stack_size(soft_limit, hard_limit):
    try:
        # Set the soft and hard limits for the maximum stack size (in bytes)
        resource.setrlimit(resource.RLIMIT_STACK, (soft_limit, hard_limit))
        print(f"Stack Size Limits Set: Soft {soft_limit} bytes, Hard {hard_limit} bytes")
    except OSError as e:
        print(f"Failed to set stack size limits: {e}")

if __name__ == "__main__":
    get_stack_size()
    set_stack_size(1024 * 1024, -1)  # Set a 1MB soft limit and no hard limit

These examples cover various aspects of resource usage management in Python, demonstrating how to monitor and control different system resources such as memory, CPU time, file descriptors, and stack size. Each example includes comments explaining the purpose of each part of the code and handling any potential exceptions that might occur.

spwd - The shadow password database.md

spwd - The shadow password database

The spwd module in the Python standard library provides access to the Unix-style shadow password database, which is used to store encrypted passwords for user accounts. This module allows you to manage and query shadow password entries without accessing the underlying system's files directly.

Below are comprehensive examples of how to use the spwd module for various operations:

Example 1: Retrieve a Shadow Password Entry

import spwd

def get_shadow_entry(username):
    """
    Retrieves the shadow password entry for a given username.

    Args:
        username (str): The username for which to retrieve the shadow password entry.

    Returns:
        dict: A dictionary containing the shadow password information.
    """
    try:
        # Retrieve the shadow password entry
        pwd_entry = spwd.getspnam(username)

        # Extract and return relevant information from the shadow password entry
        shadow_info = {
            'user': pwd_entry.sp_nam,  # Username
            'password': pwd_entry.sp_pwd,  # Encrypted Password
            'flags': pwd_entry.sp_flags,  # Flags (e.g., account expiration)
            'last_change': pwd_entry.sp_lastchg,  # Last password change timestamp
            'min': pwd_entry.sp_min,      # Minimum number of days between password changes
            'max': pwd_entry.sp_max,      # Maximum number of days a password can be used
            'warn': pwd_entry.sp_warn,    # Number of days before expiration to warn user
            'inactive': pwd_entry.sp_inact,  # Inactivity period after password expiration
            'expire': pwd_entry.sp_expire,   # Account expiration timestamp
            'reserved': pwd_entry.sp_atime,   # Last authentication time
        }

        return shadow_info
    except KeyError:
        print(f"No shadow entry found for user: {username}")
        return None

# Example usage
username = "exampleuser"
shadow_info = get_shadow_entry(username)
if shadow_info:
    print(shadow_info)

Example 2: Modify a Shadow Password Entry

import spwd
import crypt

def modify_shadow_entry(username, new_password):
    """
    Modifies the encrypted password for a given username.

    Args:
        username (str): The username whose shadow password needs to be modified.
        new_password (str): The new plain text password to encrypt and update.

    Returns:
        bool: True if the modification is successful, False otherwise.
    """
    try:
        # Retrieve the current shadow password entry
        pwd_entry = spwd.getspnam(username)

        # Encrypt the new password using crypt.CRYPT_METHOD_SHA512
        encrypted_password = crypt.crypt(new_password, crypt.METHOD_SHA512)

        # Update the shadow password in memory
        pwd_entry.sp_pwd = encrypted_password

        # Write the updated entry back to the system
        spwd.setspnam(username, pwd_entry)

        print(f"Shadow password for {username} has been successfully modified.")
        return True
    except (KeyError, crypt.CryptError) as e:
        print(f"Failed to modify shadow password for user {username}: {e}")
        return False

# Example usage
username = "exampleuser"
new_password = "new_secure_password123"
success = modify_shadow_entry(username, new_password)

Example 3: List All Shadow Password Entries

import spwd

def list_shadow_entries():
    """
    Lists all shadow password entries in the system.

    Returns:
        list: A list of dictionaries, each containing information about a shadow password entry.
    """
    shadow_entries = []

    # Iterate over all shadow password entries
    try:
        for pwd_entry in spwd.getspall():
            shadow_info = {
                'user': pwd_entry.sp_nam,
                'password': pwd_entry.sp_pwd,
                'flags': pwd_entry.sp_flags,
                'last_change': pwd_entry.sp_lastchg,
                'min': pwd_entry.sp_min,
                'max': pwd_entry.sp_max,
                'warn': pwd_entry.sp_warn,
                'inactive': pwd_entry.sp_inact,
                'expire': pwd_entry.sp_expire,
                'reserved': pwd_entry.sp_atime,
            }
            shadow_entries.append(shadow_info)
    except PermissionError:
        print("Permission denied to access shadow password database.")
    except Exception as e:
        print(f"An error occurred while listing shadow password entries: {e}")

    return shadow_entries

# Example usage
shadow_list = list_shadow_entries()
for entry in shadow_list:
    print(entry)

Note:

These examples provide a basic framework for interacting with the shadow password database using Python's spwd module. Adjustments may be needed based on specific system configurations and requirements.

syslog - Unix syslog library routines.md

syslog - Unix syslog library routines

The syslog module provides access to the system logging capabilities on Unix-like systems. This module allows you to send log messages to various destinations such as the system logger, files, or remote servers.

Here are comprehensive and well-documented code examples for each functionality in the syslog module:

1. Opening a syslog connection

import syslog

# Define the facility (e.g., LOG_USER)
facility = syslog.LOG_USER

# Open the syslog connection with default options
syslog.openlog(ident='myapp', logoption=syslog.LOG_PID, facility=facility)

# Write a debug message
syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message')

# Write an info message
syslog.syslog(syslog.LOG_INFO, 'This is an info message')

# Close the syslog connection
syslog.closelog()

2. Writing to a file

import syslog

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection with a file destination
with open('/var/log/myapp.log', 'w') as log_file:
    syslog.openlog(ident='myapp', logoption=log_option, facility=facility, logfile=log_file)

    # Write a debug message to the file
    syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message logged to a file')

    # Close the syslog connection
    syslog.closelog()

3. Writing to a remote server

import syslog

# Define the host and port of the remote syslog server
host = 'syslog.example.com'
port = 514

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection to a remote server
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    try:
        syslog.openlog(ident='myapp', logoption=log_option, facility=facility, address=host)

        # Write an info message to the remote server
        syslog.syslog(syslog.LOG_INFO, 'This is an info message sent to a remote server')

    except socket.error as e:
        print(f"Failed to open syslog connection: {e}")

    finally:
        syslog.closelog()

4. Setting log format

import syslog

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection with a custom format
with open('/var/log/myapp.log', 'w') as log_file:
    syslog.openlog(ident='myapp', logoption=log_option, facility=facility, logfile=log_file)

    # Set a custom format string for log messages
    syslog.setlogmask(syslog.LOG_UPTO(syslog.LOG_INFO))
    syslog.syslog(syslog.LOG_INFO, 'This is an info message with a custom format')

    # Close the syslog connection
    syslog.closelog()

5. Handling multiple facilities and priorities

import syslog

# Define the facilities and log options
facilities = [syslog.LOG_LOCAL0, syslog.LOG_LOCAL1]
log_options = {
    syslog.LOG_LOCAL0: syslog.LOG_PID | syslog.LOG_NDELAY,
    syslog.LOG_LOCAL1: syslog.LOG_USER | syslog.LOG_CONS
}

# Open the syslog connection with multiple facilities and priorities
for facility in facilities:
    with open('/var/log/myapp.log', 'w') as log_file:
        syslog.openlog(ident='myapp', logoption=log_options[facility], facility=facility, logfile=log_file)

        # Write debug messages to different facilities
        syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message from LOG_LOCAL0')
        syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message from LOG_LOCAL1')

    # Close the syslog connection
    syslog.closelog()

6. Using syslog messages with custom identifiers

import syslog

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection with a custom identifier
with open('/var/log/myapp.log', 'w') as log_file:
    syslog.openlog(ident='myapp.mysubsystem', logoption=log_option, facility=facility, logfile=log_file)

    # Write a debug message using a custom identifier
    syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message from mysubsystem')

    # Close the syslog connection
    syslog.closelog()

7. Handling log messages with timestamps

import syslog
import time

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection with a custom timestamp format
with open('/var/log/myapp.log', 'w') as log_file:
    syslog.openlog(ident='myapp', logoption=log_option, facility=facility, logfile=log_file)

    # Write a debug message with a custom timestamp format
    current_time = time.strftime('%Y-%m-%d %H:%M:%S')
    syslog.syslog(syslog.LOG_DEBUG, f'[{current_time}] This is a debug message')

    # Close the syslog connection
    syslog.closelog()

8. Handling log messages with different priorities

import syslog

# Define the facility and log option
facility = syslog.LOG_LOCAL0
log_option = syslog.LOG_PID | syslog.LOG_NDELAY

# Open the syslog connection with different priorities
with open('/var/log/myapp.log', 'w') as log_file:
    syslog.openlog(ident='myapp', logoption=log_option, facility=facility, logfile=log_file)

    # Write debug messages to different priorities
    syslog.syslog(syslog.LOG_DEBUG, 'This is a debug message')
    syslog.syslog(syslog.LOG_INFO, 'This is an info message')
    syslog.syslog(syslog.LOG_WARNING, 'This is a warning message')
    syslog.syslog(syslog.LOG_ERR, 'This is an error message')
    syslog.syslog(syslog.LOG_CRIT, 'This is a critical message')
    syslog.syslog(syslog.LOG_ALERT, 'This is an alert message')
    syslog.syslog(syslog.LOG_EMERG, 'This is an emergency message')

    # Close the syslog connection
    syslog.closelog()

These examples demonstrate various functionalities of the syslog module, including opening connections to different destinations, writing log messages with custom formats and identifiers, handling different priorities, and logging to files or remote servers. Each example includes comments explaining each step for clarity and completeness.

termios - POSIX style tty control.md

termios - POSIX style tty control

The termios module in Python provides a way to manipulate terminal-related information, such as input modes, output modes, line discipline settings, and more. This module allows you to interact directly with terminal devices using the POSIX interface.

Here are some comprehensive code examples that demonstrate various functionalities of the termios module:

Example 1: Setting Terminal Modes

This example shows how to set the terminal modes for raw input, disabling echo, and turning off canonical mode (which is typically enabled by default in interactive shells).

import termios
import tty
import sys

def set_raw_mode(fd):
    """Set the terminal into raw mode."""
    try:
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        new_settings = old_settings.copy()

        # Disable canonical mode and echo
        new_settings[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK |
                                termios.ISTRIP | termios.INLCR | termios. IGNCR |
                                termios.ICRNL | termios.IMAXBEL)
        new_settings[1] &= ~termios.ECHO
        new_settings[2] &= ~(termios.OPOST)

        termios.tcsetattr(fd, termios.TCSANOW, new_settings)
    except Exception as e:
        print(f"Error setting raw mode: {e}")

def main():
    try:
        set_raw_mode(sys.stdin.fileno())
        print("Terminal set to raw mode. Press any key to exit.")

        # Read a character
        input_char = sys.stdin.read(1)
        print(f"You pressed: {input_char}")
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, termios.tcgetattr(sys.stdin.fileno()))

if __name__ == "__main__":
    main()

Example 2: Changing Line Discipline

This example demonstrates how to change the line discipline of a terminal. For instance, you can set it to NLDISC_MINIMAL which is useful for terminals that do not require any special handling of newlines.

import termios
import tty
import sys

def set_line_discipline(fd, discipline):
    """Set the terminal's line discipline."""
    try:
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        new_settings = old_settings.copy()

        # Set the line discipline
        new_settings[6] = discipline

        termios.tcsetattr(fd, termios.TCSANOW, new_settings)
    except Exception as e:
        print(f"Error setting line discipline: {e}")

def main():
    try:
        set_line_discipline(sys.stdin.fileno(), termios.NLDISC_MINIMAL)
        print("Line discipline set to MINIMAL.")
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, termios.tcgetattr(sys.stdin.fileno()))

if __name__ == "__main__":
    main()

Example 3: Reading and Writing Terminal Input

This example shows how to read input from a terminal in raw mode and write output back to it.

import termios
import tty
import sys

def set_raw_mode(fd):
    """Set the terminal into raw mode."""
    try:
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        new_settings = old_settings.copy()

        # Disable canonical mode and echo
        new_settings[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK |
                                termios.ISTRIP | termios.INLCR | termios. IGNCR |
                                termios.ICRNL | termios.IMAXBEL)
        new_settings[1] &= ~termios.ECHO
        new_settings[2] &= ~(termios.OPOST)

        termios.tcsetattr(fd, termios.TCSANOW, new_settings)
    except Exception as e:
        print(f"Error setting raw mode: {e}")

def main():
    try:
        set_raw_mode(sys.stdin.fileno())
        print("Terminal set to raw mode. Press a key followed by 'Enter'.")

        # Read input
        input_line = sys.stdin.readline().strip()
        print(f"You entered: {input_line}")
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, termios.tcgetattr(sys.stdin.fileno()))

if __name__ == "__main__":
    main()

Example 4: Querying Terminal Attributes

This example shows how to query and print various attributes of the terminal.

import termios
import sys

def get_terminal_attributes(fd):
    """Retrieve and print terminal attributes."""
    try:
        fd = sys.stdin.fileno()
        settings = termios.tcgetattr(fd)

        # Print input modes
        print(f"Input Modes: {settings[0]}")

        # Print output modes
        print(f"Output Modes: {settings[1]}")

        # Print local flags
        print(f"Local Flags: {settings[2]}")

        # Print control characters
        print(f"Control Characters: {settings[3]}")

        # Print special character sets
        print(f"Special Character Sets: {settings[4]}")

        # Print current line discipline
        print(f"Current Line Discipline: {settings[5]}")
    except Exception as e:
        print(f"Error querying terminal attributes: {e}")

def main():
    try:
        get_terminal_attributes(sys.stdin.fileno())
    finally:
        pass

if __name__ == "__main__":
    main()

Example 5: Setting Special Character Sets

This example demonstrates how to set special character sets in the terminal, which can be useful for configuring certain types of terminals or emulators.

import termios
import tty
import sys

def set_special_character_sets(fd):
    """Set special character sets."""
    try:
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        new_settings = old_settings.copy()

        # Set a specific special character set (e.g., ASCII 0x81 for IBM PC compatibility)
        new_settings[4] = bytearray([2])  # Byte to represent the special character set

        termios.tcsetattr(fd, termios.TCSANOW, new_settings)
    except Exception as e:
        print(f"Error setting special character sets: {e}")

def main():
    try:
        set_special_character_sets(sys.stdin.fileno())
        print("Special character sets set.")
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, termios.tcgetattr(sys.stdin.fileno()))

if __name__ == "__main__":
    main()

Example 6: Changing Input Modes

This example shows how to change the input modes of the terminal. For instance, you can disable canonical mode and enable canonical mode.

import termios
import tty
import sys

def set_input_mode(fd, mode):
    """Set the terminal's input mode."""
    try:
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        new_settings = old_settings.copy()

        # Set the input mode
        new_settings[0] |= mode  # Enable or disable canonical mode

        termios.tcsetattr(fd, termios.TCSANOW, new_settings)
    except Exception as e:
        print(f"Error setting input mode: {e}")

def main():
    try:
        set_input_mode(sys.stdin.fileno(), termios.ICANON)  # Enable canonical mode
        print("Input mode set to CANON.")
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, termios.tcgetattr(sys.stdin.fileno()))

if __name__ == "__main__":
    main()

These examples cover a range of functionalities in the termios module, from setting basic terminal modes to querying and modifying various aspects of terminal attributes. Each example is designed to be clear and self-contained, providing a practical demonstration of how to use the termios module for controlling terminal behavior in Python applications.

tty - Terminal control functions.md

tty - Terminal control functions

The tty module in Python provides a way to interact with terminal devices, allowing you to configure the input/output modes of a terminal. Here are comprehensive and well-documented examples of how to use each function available in this module:

1. tty.iflag

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Get current termios settings
    old_attrs = termios.tcgetattr(fd)

    # Modify termios settings
    new_attrs = old_attrs[:]
    new_attrs[6][termios.VMIN] = 1  # Minimum number of characters to read
    new_attrs[6][termios.VTIME] = 0  # Time out in deciseconds

    # Apply modified termios settings
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data with the new input mode settings
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original termios settings
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

2. tty.oflag

import tty

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Get current oflag settings
    old_oflag = tty.tcgetattr(fd)

    # Modify oflag settings
    new_oflag = old_oflag[:]
    new_oflag[tty.ONLCR] = False  # Disable newline translation

    # Apply modified oflag settings
    tty.tcsetattr(fd, tty.TCSANOW, new_oflag)

    try:
        while True:
            # Write data with the new output mode settings
            fd.write('Hello, World!\n')
    finally:
        # Restore original oflag settings
        tty.tcsetattr(fd, tty.TCSANOW, old_oflag)

3. tty.cflag

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Get current termios settings
    old_attrs = termios.tcgetattr(fd)

    # Modify termios settings
    new_attrs = old_attrs[:]
    new_attrs[2] &= ~termios.CSIZE  # Clear current character size mask
    new_attrs[2] |= termios.CS8     # Set character size to 8 bits

    # Apply modified termios settings
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data with the new control mode settings
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original termios settings
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

4. tty.lflag

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Get current lflag settings
    old_attrs = termios.tcgetattr(fd)

    # Modify lflag settings
    new_attrs = old_attrs[:]
    new_attrs[3] &= ~termios.ICANON  # Disable canonical mode

    # Apply modified lflag settings
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data with the new local mode settings
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original lflag settings
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

5. tty.isatty

import tty
import termios
import sys

# Open a terminal device
with open('/dev/tty', 'rb+') as fd:
    # Get current lflag settings
    old_attrs = termios.tcgetattr(fd)

    # Modify lflag settings
    new_attrs = old_attrs[:]
    new_attrs[3] &= ~termios.ICANON  # Disable canonical mode

    # Apply modified lflag settings
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data with the new local mode settings
            data = sys.stdin.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original lflag settings
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

6. tty.getattr

import tty

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Retrieve the current attributes
    attrs = tty.tcgetattr(fd)

    print("Input Mode Flags:", attrs[tty.IFLAG])
    print("Output Mode Flags:", attrs[tty.OFLAG])
    print("Control Mode Flags:", attrs[tty.CFLAG])
    print("Local Mode Flags:", attrs[tty.LFLAG])

7. tty.setattr

import tty

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Get current attributes
    old_attrs = tty.tcgetattr(fd)

    # Copy the entire old_attrs list to new_attrs
    new_attrs = old_attrs[:]

    # Modify the input mode flags (first element of the list)
    new_iflag = new_attrs[0]
    new_iflag |= tty.VMIN
    new_iflag |= tty.VTIME

    # Update the first element of new_attrs
    new_attrs[0] = new_iflag

    # Set the modified attributes
    tty.tcsetattr(fd, tty.TCSANOW, new_attrs)

    print("New Input Mode Flags:", new_iflag)

8. tty.cbreak

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Save the original terminal settings
    original_settings = termios.tcgetattr(fd)

    # Enter cbreak mode
    tty.setcbreak(fd)

    try:
        while True:
            # Read data in cbreak mode
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(fd, termios.TCSADRAIN, original_settings)

9. tty.raw

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Save the original terminal settings
    original_settings = termios.tcgetattr(fd)

    # Enter raw mode
    tty.setraw(fd)

    try:
        while True:
            # Read data in raw mode
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore the original terminal settings
        termios.tcsetattr(fd, termios.TCSADRAIN, original_settings)

10. tty.setraw

import tty
import termios
import sys

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Set the terminal to raw mode
    old_attrs = termios.tcgetattr(fd)
    new_attrs = termios.tcgetattr(fd)
    new_attrs[3] = new_attrs[3] & ~(termios.ICANON | termios.ECHO)
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data in raw mode
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original attributes
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

11. tty.reset

import tty
import termios

# Open a terminal device
with open('/dev/tty', 'r+') as fd:
    # Reset the terminal to a default state
    old_attrs = termios.tcgetattr(fd)
    new_attrs = old_attrs[:]
    new_attrs[tty.LFLAG] |= (termios.ICANON | termios.ECHO)
    termios.tcsetattr(fd, termios.TCSANOW, new_attrs)

    try:
        while True:
            # Read data in default state
            data = fd.read(1)
            print(data, end='', flush=True)
    finally:
        # Restore original attributes
        termios.tcsetattr(fd, termios.TCSANOW, old_attrs)

These examples demonstrate various functionalities of the tty module, including setting and modifying input/output modes, checking if a file descriptor is associated with a terminal, and resetting the terminal to its default state. Each example includes comments for clarity and ensures that the terminal attributes are restored after operations are completed. Additionally, examples are provided to handle both cbreak and raw mode using tty.cbreak() and tty.raw().

XML Processing Modules

xml.dom - The Document Object Model API.md

xml.dom - The Document Object Model API

The xml.dom module is part of Python's standard library and provides a convenient way to work with XML documents using the DOM (Document Object Model) approach. This module allows you to create, manipulate, and parse XML data in a structured object-oriented manner.

Below are comprehensive examples for each functionality available in the xml.dom module:

1. Creating an XML Document

import xml.dom.minidom

# Create a new DOM document
doc = xml.dom.minidom.Document()

# Create root element
root = doc.createElement("Root")
doc.appendChild(root)

# Create child elements and add them to the root
child1 = doc.createElement("Child1")
child1.setAttribute("name", "Item1")
child2 = doc.createElement("Child2")
child2.setAttribute("value", "Value2")

root.appendChild(child1)
root.appendChild(child2)

# Print the XML string representation of the document
xml_str = doc.toprettyxml(indent="  ")
print(xml_str)

2. Parsing an XML String

import xml.dom.minidom

# Define an XML string
xml_string = """
<Root>
    <Child1 name="Item1">
        <Subchild>Content</Subchild>
    </Child1>
    <Child2 value="Value2"/>
</Root>
"""

# Parse the XML string
dom_doc = xml.dom.minidom.parseString(xml_string)

# Access elements by tag name
root_element = dom_doc.documentElement
child_elements = root_element.getElementsByTagName("Child1")

for child in child_elements:
    print(child.getAttribute("name"), child.firstChild.data)

3. Creating an XML Element and Attribute

import xml.dom.minidom

# Create a new DOM document
doc = xml.dom.minidom.Document()

# Create a root element
root = doc.createElement("Root")
doc.appendChild(root)

# Create a child element with an attribute
child_element = doc.createElement("ChildElement")
child_element.setAttribute("attr", "attributeValue")

# Add the child to the root
root.appendChild(child_element)

# Print the XML string representation of the document
xml_str = doc.toprettyxml(indent="  ")
print(xml_str)

4. Iterating Over Elements and Attributes

import xml.dom.minidom

# Define an XML string
xml_string = """
<Root>
    <Child1 name="Item1">
        <Subchild>Content</Subchild>
    </Child1>
    <Child2 value="Value2"/>
</Root>
"""

# Parse the XML string
dom_doc = xml.dom.minidom.parseString(xml_string)

# Access elements and attributes by tag name
root_element = dom_doc.documentElement

# Iterate over child elements and print their attributes
child_elements = root_element.getElementsByTagName("Child1")
for child in child_elements:
    for attr_name, attr_value in child.attributes.items():
        print(f"Attribute: {attr_name}, Value: {attr_value}")

# Iterate over child elements and print their text content
for child in child_elements:
    print(child.firstChild.data)

5. Writing XML to a File

import xml.dom.minidom

# Create a new DOM document
doc = xml.dom.minidom.Document()

# Create root element
root = doc.createElement("Root")
doc.appendChild(root)

# Create child elements and add them to the root
child1 = doc.createElement("Child1")
child1.setAttribute("name", "Item1")
child2 = doc.createElement("Child2")
child2.setAttribute("value", "Value2")

root.appendChild(child1)
root.appendChild(child2)

# Write the XML document to a file
with open("output.xml", "w") as file:
    file.write(doc.toprettyxml(indent="  "))

6. Handling Namespaces

import xml.dom.minidom

# Define an XML string with namespaces
xml_string = """
<ns1:Root xmlns:ns1="http://www.example.com/ns1">
    <ns1:Child1 name="Item1"/>
    <ns2:Child2 value="Value2" xmlns:ns2="http://www.example.com/ns2"/>
</ns1:Root>
"""

# Parse the XML string
dom_doc = xml.dom.minidom.parseString(xml_string)

# Access elements by namespace
root_element = dom_doc.documentElement
child_elements = root_element.getElementsByTagNameNS("http://www.example.com/ns1", "Child1")

for child in child_elements:
    print(child.getAttribute("name"))

# Access elements by another namespace
child_elements = root_element.getElementsByTagNameNS("http://www.example.com/ns2", "Child2")
for child in child_elements:
    print(child.getAttribute("value"))

7. Creating a DOM Element from Scratch

import xml.dom.minidom

# Create a new DOM document
doc = xml.dom.minidom.Document()

# Create root element with namespace
root = doc.createElementNS("http://www.example.com/ns1", "ns1:Root")
doc.appendChild(root)

# Create child elements and add them to the root
child1 = doc.createElementNS("http://www.example.com/ns2", "ns2:Child1")
child1.setAttributeNS("http://www.example.com/ns1", "attr", "attributeValue")

root.appendChild(child1)

# Print the XML string representation of the document
xml_str = doc.toprettyxml(indent="  ")
print(xml_str)

8. Copying and Modifying Nodes

import xml.dom.minidom

# Define an XML string
xml_string = """
<Root>
    <Child1 name="Item1">
        <Subchild>Content</Subchild>
    </Child1>
    <Child2 value="Value2"/>
</Root>
"""

# Parse the XML string
dom_doc = xml.dom.minidom.parseString(xml_string)

# Copy a node and modify its text content
root_element = dom_doc.documentElement
child1 = root_element.getElementsByTagName("Child1")[0]
new_child1 = child1.cloneNode(deep=True)
new_subchild = doc.createElement("Subchild")
new_subchild.appendChild(doc.createTextNode("Modified Content"))
new_child1.replaceChild(new_subchild, child1.firstChild)

# Print the modified XML string representation of the document
xml_str = doc.toprettyxml(indent="  ")
print(xml_str)

These examples demonstrate various functionalities available in the xml.dom module, including creating and parsing XML documents, handling elements and attributes, working with namespaces, and copying and modifying nodes. Each example is well-documented to help you understand how to use each feature effectively.

xml.dom.minidom - Minimal DOM implementation.md

xml.dom.minidom - Minimal DOM implementation

Certainly! Below is a comprehensive list of code examples demonstrating various functionalities of the xml.dom.minidom module, which provides a simple and efficient API for parsing XML documents and creating new ones. Each example includes comments to explain each step.

1. Parsing an XML Document

import xml.dom.minidom as minidom

# Load an XML document from a file
doc = minidom.parse('example.xml')

# Accessing elements
root_element = doc.documentElement
print("Root Element:", root_element.tagName)

# Getting child nodes
child_nodes = root_element.childNodes
for node in child_nodes:
    if node.nodeType == node.ELEMENT_NODE:
        print("Child Node:", node.tagName)

# Printing the XML string representation
xml_string = doc.toprettyxml(indent="  ")
print(xml_string)

2. Creating a New XML Document

import xml.dom.minidom as minidom

# Create a new document object
doc = minidom.Document()

# Adding an element to the document
root = doc.createElement('root')
doc.appendChild(root)

# Creating child elements and adding them to the root
child1 = doc.createElement('child1')
child2 = doc.createElement('child2')

text_node = doc.createTextNode("Hello, World!")
child1.appendChild(text_node)
root.appendChild(child1)
root.appendChild(child2)

# Printing the XML string representation
xml_string = doc.toprettyxml(indent="  ")
print(xml_string)

3. Modifying an Existing XML Document

import xml.dom.minidom as minidom

# Load an existing XML document
doc = minidom.parse('example.xml')

# Accessing elements and modifying their content
root_element = doc.documentElement
child_elements = root_element.getElementsByTagName('child1')
for child in child_elements:
    text_node = child.firstChild
    text_node.data = "Updated Content"

# Printing the updated XML string representation
xml_string = doc.toprettyxml(indent="  ")
print(xml_string)

4. Writing to a File

import xml.dom.minidom as minidom

# Create a new document object
doc = minidom.Document()

# Adding elements to the document and saving it to a file
root = doc.createElement('root')
doc.appendChild(root)

child1 = doc.createElement('child1')
text_node = doc.createTextNode("Hello, World!")
child1.appendChild(text_node)
root.appendChild(child1)

with open('output.xml', 'w') as file:
    file.write(doc.toprettyxml(indent="  "))

print("XML saved to output.xml")

5. Searching for Elements

import xml.dom.minidom as minidom

# Load an XML document
doc = minidom.parse('example.xml')

# Searching for elements by tag name
child_elements = doc.getElementsByTagName('child2')
for child in child_elements:
    print("Found:", child.tagName)

# Searching for elements by attribute
attribute_elements = doc.getElementsByTagName('child1')
for child in attribute_elements:
    if child.getAttributeNode('type'):
        print("Found with attribute:", child.tagName)

6. Handling Namespaces

import xml.dom.minidom as minidom

# Load an XML document with namespaces
doc = minidom.parse('example_ns.xml')

# Accessing elements with namespaces
ns_map = {'ns': 'http://example.com/ns'}
root_element = doc.documentElement
child_elements = root_element.getElementsByTagNameNS(ns_map['ns'], 'child1')
for child in child_elements:
    print("Found with namespace:", child.tagName)

7. Traversing the DOM Tree

import xml.dom.minidom as minidom

# Load an XML document
doc = minidom.parse('example.xml')

# Iterating over all elements in the tree
for elem in doc.getElementsByTagName('*'):
    print("Element:", elem.tagName)

8. Using XPath for Querying

import xml.dom.minidom as minidom

# Load an XML document
doc = minidom.parse('example.xml')

# Using XPath to query elements
xpath_result = doc.evaluate('/root/child1', doc, None, minidom.XPathConstants.NODESET)
for node in xpath_result:
    print("XPath Result:", node.tagName)

These examples cover a range of functionalities provided by the xml.dom.minidom module, from parsing and creating XML documents to modifying them, saving them to files, searching for elements, handling namespaces, traversing the DOM tree, and using XPath. Each example is designed to be clear and self-contained, with comments explaining each step.

xml.dom.pulldom - Support for building partial DOM trees.md

xml.dom.pulldom - Support for building partial DOM trees

The xml.dom.pulldom module in Python provides a way to parse XML documents without creating a full DOM tree in memory. This is particularly useful when dealing with large XML files or when you only need to access specific parts of the document. Below are comprehensive examples demonstrating various functionalities of the xml.dom.pulldom module.

Example 1: Basic Usage of pulldom

from xml.dom import pulldom

# Create a parser
parser = pulldom.make_parser()

# Define handlers for different events
handler = pulldom.ContentHandler()
handler.startElement = lambda name, attrs: print(f"Start Element: {name}, Attributes: {attrs}")
handler.endElement   = lambda name: print(f"End Element: {name}")

# Parse an XML file
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handler.handleEvent(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

Example 2: Parsing Multiple Nodes

from xml.dom import pulldom

# Create a parser
parser = pulldom.make_parser()

# Define handlers for different events
handler = pulldom.ContentHandler()
handler.startElement = lambda name, attrs: print(f"Start Element: {name}, Attributes: {attrs}")
handler.endElement   = lambda name: print(f"End Element: {name}")

# Parse an XML file
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handler.handleEvent(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

Example 3: Using a Callback Function

from xml.dom import pulldom

def handle_event(event, node):
    if event == pulldom.START_ELEMENT:
        print(f"Start Element: {node.nodeName}, Attributes: {node.attributes}")
    elif event == pulldom.END_ELEMENT:
        print(f"End Element: {node.nodeName}")

# Create a parser
parser = pulldom.make_parser()

# Parse an XML file
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handle_event(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

Example 4: Parsing with Namespaces

from xml.dom import pulldom

def handle_event(event, node):
    if event == pulldom.START_ELEMENT:
        print(f"Start Element: {node.nodeName}, Attributes: {node.attributes}")
        for name, value in node.getNamespaceMap().items():
            print(f"Namespace: {name} -> {value}")
    elif event == pulldom.END_ELEMENT:
        print(f"End Element: {node.nodeName}")

# Create a parser
parser = pulldom.make_parser()

# Parse an XML file with namespaces
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handle_event(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

Example 5: Parsing and Accessing Attributes

from xml.dom import pulldom

def handle_event(event, node):
    if event == pulldom.START_ELEMENT:
        attributes = {attr.nodeName: attr.nodeValue for attr in node.attributes}
        print(f"Start Element: {node.nodeName}, Attributes: {attributes}")
    elif event == pulldom.END_ELEMENT:
        print(f"End Element: {node.nodeName}")

# Create a parser
parser = pulldom.make_parser()

# Parse an XML file
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handle_event(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

Example 6: Parsing with Namespaces and Attributes

from xml.dom import pulldom

def handle_event(event, node):
    if event == pulldom.START_ELEMENT:
        attributes = {attr.nodeName: attr.nodeValue for attr in node.attributes}
        print(f"Start Element: {node.nodeName}, Attributes: {attributes}")
        for name, value in node.getNamespaceMap().items():
            print(f"Namespace: {name} -> {value}")
    elif event == pulldom.END_ELEMENT:
        print(f"End Element: {node.nodeName}")

# Create a parser
parser = pulldom.make_parser()

# Parse an XML file with namespaces and attributes
with open('example.xml', 'r') as file:
    for event, node in parser.parse(file):
        handle_event(event, node)

# Clear the parser after parsing to avoid memory leaks
parser.clear()

These examples demonstrate various ways to use the xml.dom.pulldom module to parse XML documents and handle events such as start and end elements. Each example includes comments explaining the purpose of each part of the code, making it easy for readers to understand and modify as needed.

xml.etree.ElementTree - The ElementTree XML API.md

xml.etree.ElementTree - The ElementTree XML API

The xml.etree.ElementTree is a lightweight and efficient library in Python used for parsing and creating XML data. Below are comprehensive and well-documented code examples covering various functionalities of the ElementTree module:

1. Creating an Element Tree

from xml.etree import ElementTree as ET

# Create the root element
root = ET.Element("bookstore")

# Add child elements to the root
book = ET.SubElement(root, "book", ISBN="978-3-16-148410-0")
title = ET.SubElement(book, "title")
title.text = "XML Developer's Guide"
author = ET.SubElement(book, "author")
author.text = "David Beazley"

# Create a new ElementTree object
tree = ET.ElementTree(root)

# Write the tree to an XML file
tree.write("bookstore.xml", encoding="utf-8", xml_declaration=True)

2. Parsing an XML File

from xml.etree import ElementTree as ET

# Parse the XML file
tree = ET.parse('bookstore.xml')

# Get the root element of the tree
root = tree.getroot()

# Iterate over each book in the bookstore
for book in root.findall("book"):
    isbn = book.attrib["ISBN"]
    title = book.find("title").text
    author = book.find("author").text

    print(f"ISBN: {isbn}, Title: {title}, Author: {author}")

3. Creating an Element and Adding Attributes

from xml.etree import ElementTree as ET

# Create a new element with attributes
person = ET.Element("person", first="John", last="Doe")

# Add text to the element
person.text = "This is John Doe."

# Write the element to an XML file
tree = ET.ElementTree(person)
tree.write("person.xml")

4. Adding Elements and Text to Existing Elements

from xml.etree import ElementTree as ET

# Parse an existing XML file
tree = ET.parse('bookstore.xml')

# Get the root element of the tree
root = tree.getroot()

# Create a new book element
new_book = ET.Element("book", ISBN="978-3-16-148420-3")

# Add child elements to the new book
title = ET.SubElement(new_book, "title")
title.text = "Learning XML"

author = ET.SubElement(new_book, "author")
author.text = "James Clarke"

# Append the new book element to the root
root.append(new_book)

# Write the updated tree back to an XML file
tree.write("updated-bookstore.xml", encoding="utf-8", xml_declaration=True)

5. Iterating Over Elements with Specific Tags

from xml.etree import ElementTree as ET

# Parse an XML file
tree = ET.parse('bookstore.xml')

# Get the root element of the tree
root = tree.getroot()

# Iterate over each book title in the bookstore
for title in root.findall(".//title"):
    print(title.text)

6. Removing Elements and Text

from xml.etree import ElementTree as ET

# Parse an existing XML file
tree = ET.parse('bookstore.xml')

# Get the root element of the tree
root = tree.getroot()

# Find a specific book by ISBN and remove it
for book in root.findall("book"):
    if book.attrib["ISBN"] == "978-3-16-148420-3":
        root.remove(book)

# Write the updated tree back to an XML file
tree.write("updated-bookstore.xml", encoding="utf-8", xml_declaration=True)

7. Searching for Elements Using XPath

from xml.etree import ElementTree as ET

# Parse an XML file
tree = ET.parse('bookstore.xml')

# Use XPath to find all book elements with a specific author
books_by_james = tree.findall(".//book[author='James Clarke']")

# Iterate over the found books and print their titles
for book in books_by_james:
    title = book.find("title").text
    print(f"Title: {title}")

8. Writing Elements to a String

from xml.etree import ElementTree as ET

# Create an element tree
root = ET.Element("bookstore")
ET.SubElement(root, "book", ISBN="978-3-16-148420-3").text = "Learning XML"

# Convert the tree to a string
xml_string = ET.tostring(root, encoding="unicode")

print(xml_string)

These examples demonstrate various aspects of working with XML using ElementTree, from creating and parsing documents to modifying and searching for elements. Each example includes comments explaining key steps and best practices for handling XML data in Python.

xml.parsers.expat - Fast XML parsing using Expat.md

xml.parsers.expat - Fast XML parsing using Expat

Below are comprehensive code examples for various functionalities of the xml.parsers.expat module, which is a fast and simple parser for XML documents in Python.

Example 1: Basic Parsing with Callbacks

This example demonstrates how to use callbacks to handle elements and attributes during parsing.

import xml.parsers.expat

# Define callback functions for handling start tags, end tags, and character data
def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate()

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML string
xml_data = """
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentis</author>
        <year>2005</year>
        <price>13.50</price>
    </book>
    <book category="children">
        <title lang="en">Harry Potter and the Sorcerer's Stone</title>
        <author>J.K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>
"""

parser.Parse(xml_data)

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

Example 2: Parsing XML from a File

This example shows how to parse an XML file using the xml.parsers.expat module.

import xml.parsers.expat

def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate()

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML file
with open('books.xml', 'r') as file:
    parser.ParseFile(file)

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

Example 3: Parsing with Attributes and Namespaces

This example demonstrates how to handle attributes and namespaces during parsing.

import xml.parsers.expat

def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate()

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML string with namespaces
xml_data = """
<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.example.com/books
                               books.xsd">
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentis</author>
        <year>2005</year>
        <price>13.50</price>
    </book>
    <book category="children" xmlns:child="http://www.example.com/children">
        <title lang="en">Harry Potter and the Sorcerer's Stone</title>
        <author>J.K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>
"""

parser.Parse(xml_data)

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

Example 4: Error Handling

This example demonstrates how to handle parsing errors gracefully.

import xml.parsers.expat

def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate()

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML string with a syntax error
xml_data = """
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentis</author>
        <year>2005</year>
        <price>13.50</price>
</bookstore>
"""

try:
    parser.Parse(xml_data)
except xml.parsers.expat.ExpatError as e:
    print(f"Error parsing XML: {e}")

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

Example 5: Parsing with Entity References

This example demonstrates how to handle entity references during parsing.

import xml.parsers.expat

def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate()

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML string with entity references
xml_data = """
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian &amp; Pasta</title>
        <author>Giada De Laurentis</author>
        <year>2005</year>
        <price>13.50</price>
    </book>
</bookstore>
"""

parser.Parse(xml_data)

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

Example 6: Parsing with Encoding

This example demonstrates how to handle different character encodings during parsing.

import xml.parsers.expat

def start_element(name, attrs):
    print(f"Start Element: {name}")
    for attr_name, attr_value in attrs.items():
        print(f"  Attribute: {attr_name} = {attr_value}")

def end_element(name):
    print(f"End Element: {name}")

def characters(data):
    print(f"Characters: {data.strip()}")

# Create a parser object
parser = xml.parsers.expat.ParserCreate('iso-8859-1', 'replace')

# Set the callback functions
parser.StartElementHandler = start_element
parser.EndElementHandler = end_element
parser.CharacterDataHandler = characters

# Parse an XML string with ISO-8859-1 encoding and replace unsupported characters
xml_data = """
<bookstore>
    <book category="cooking">
        <title lang="en">รrea de cocina</title>
        <author>Giada De Laurentis</author>
        <year>2005</year>
        <price>13.50</price>
    </book>
</bookstore>
"""

parser.Parse(xml_data)

# Call end_element for any remaining unclosed tags
parser.Parse('', True)

These examples cover various aspects of using the xml.parsers.expat module, including basic parsing with callbacks, parsing from files, handling attributes and namespaces, error handling, entity references, and different character encodings. You can include these in your documentation to provide a comprehensive understanding of the module's capabilities.

xml.sax - Support for SAX2 parsers.md

xml.sax - Support for SAX2 parsers

The xml.sax module is part of Python's standard library and provides a simple API for parsing XML data using the Simple API for XML (SAX) parser. The SAX parser is an event-driven XML parser that reads XML content in chunks, allowing you to process elements as they are encountered rather than waiting for the entire document to be parsed.

Here are some comprehensive code examples that demonstrate various functionalities of the xml.sax module:

Example 1: Basic Parsing

import xml.sax
from xml.sax.handler import ContentHandler

# Define a handler class to handle parsing events
class SimpleXMLHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"Start Element: {name}, Attributes: {attrs}")

    def endElement(self, name):
        print(f"End Element: {name}")

    def characters(self, content):
        if content.strip():
            print(f"Characters: {content.strip()}")

# Create an instance of the handler
handler = SimpleXMLHandler()

# Parse an XML file using the handler
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
xml_file_path = "example.xml"
try:
    parser.parse(xml_file_path)
except Exception as e:
    print(f"Error parsing XML: {e}")

Example 2: Parsing with Namespaces

import xml.sax
from xml.sax.handler import ContentHandler

class NamespacedXMLHandler(ContentHandler):
    def startElementNS(self, name, qname, attrs):
        # The name is the local part of the element name, and qname is the qualified (namespace) name
        print(f"Start Element: {qname}, Attributes: {attrs}")

    def endElementNS(self, name, qname):
        print(f"End Element: {qname}")

    def characters(self, content):
        if content.strip():
            print(f"Characters: {content.strip()}")

handler = NamespacedXMLHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)

# Parse an XML file with namespaces
xml_file_path = "example_ns.xml"
try:
    parser.parse(xml_file_path)
except Exception as e:
    print(f"Error parsing XML: {e}")

Example 3: Using SAX to Validate XML

import xml.sax.handler
from xml.sax import make_parser
from xml.sax.expatreader import ExpatParserFactory

class ValidationHandler(xml.sax.handler.ContentHandler):
    def error(self, msg):
        print(f"Error: {msg}")
    def fatalError(self, msg):
        print(f"Fatal Error: {msg}")

handler = ValidationHandler()
parser_factory = ExpatParserFactory()
parser = parser_factory.create_parser()

# Enable validation
parser.setFeature(xml.sax.handler.feature_validation, True)

# Set the error handler
parser.setErrorHandler(handler)

# Parse an XML file with validation
xml_file_path = "example_valid.xml"
try:
    parser.parse(xml_file_path)
except Exception as e:
    print(f"Error parsing XML: {e}")

Example 4: Using SAX for XPath Queries

import xml.sax.handler
from xml.sax import make_parser
from xml.dom.minidom import parseString
from xml.xpath import XPath, XPathException

class XPathHandler(ContentHandler):
    def __init__(self, xpath_query):
        self.xpath_query = xpath_query
        self.result = []

    def startElement(self, name, attrs):
        pass

    def endElement(self, name):
        pass

    def characters(self, content):
        if content.strip():
            self.result.append(content)

    def processXPathQuery(self, xml_data):
        try:
            dom = parseString(xml_data)
            xpath = XPath(self.xpath_query)
            nodes = xpath.evaluate(dom)
            for node in nodes:
                print(f"Node: {node.toxml()}")
        except XPathException as e:
            print(f"XPath error: {e}")

handler = XPathHandler("//element[@attribute='value']")
parser = make_parser()
parser.setContentHandler(handler)

# Parse an XML file and process the XPath query
xml_file_path = "example_xpath.xml"
try:
    parser.parse(xml_file_path)
except Exception as e:
    print(f"Error parsing XML: {e}")

Example 5: Using SAX for Namespace Processing

import xml.sax.handler
from xml.sax import make_parser
from xml.dom.minidom import parseString
from xml.namespace import Namespace

class NamespacesHandler(ContentHandler):
    def __init__(self, namespace_uri):
        self.namespace = Namespace(namespace_uri)

    def startElementNS(self, name, qname, attrs):
        # Extracting the local part of the element name and converting it to a full QName
        local_name = name[0]
        prefix = self.namespace.prefix(local_name)
        if prefix:
            qualified_name = f"{prefix}:{local_name}"
        else:
            qualified_name = local_name
        print(f"Start Element: {qualified_name}, Attributes: {attrs}")

    def endElementNS(self, name, qname):
        # Extracting the local part of the element name and converting it to a full QName
        local_name = name[0]
        prefix = self.namespace.prefix(local_name)
        if prefix:
            qualified_name = f"{prefix}:{local_name}"
        else:
            qualified_name = local_name
        print(f"End Element: {qualified_name}")

    def characters(self, content):
        if content.strip():
            print(f"Characters: {content.strip()}")

handler = NamespacesHandler("http://example.com")
parser = make_parser()
parser.setContentHandler(handler)

# Parse an XML file with namespaces
xml_file_path = "example_ns.xml"
try:
    parser.parse(xml_file_path)
except Exception as e:
    print(f"Error parsing XML: {e}")

Explanation

These examples demonstrate how to use various features of the xml.sax module to parse XML data in Python. Each example includes comments explaining the purpose of each part of the code, making it easy to understand and maintain.

xml.sax.handler - Base classes for SAX handlers.md

xml.sax.handler - Base classes for SAX handlers

The xml.sax.handler module is part of the Python Standard Library's XML parsing capabilities, providing a foundation for writing event-driven parsers using the Simple API for XML (SAX). This module includes several base classes and interfaces that allow you to define custom behavior when parsing an XML document. Below are comprehensive code examples demonstrating various functionalities in this module.

Example 1: Implementing a Basic SAX Handler

import xml.sax.handler as sax_handler

class SimpleContentHandler(sax_handler.ContentHandler):
    def __init__(self):
        self.text = []

    def characters(self, data):
        # This method is called for each chunk of text found in the XML document.
        self.text.append(data)

    def startElement(self, name, attrs):
        # This method is called when an element starts.
        print(f"Start Element: {name}, Attributes: {attrs}")

    def endElement(self, name):
        # This method is called when an element ends.
        print(f"End Element: {name}")
        # Join the collected text and print it
        if self.text:
            print("Text:", ''.join(self.text))
            self.text = []

# Example usage
if __name__ == "__main__":
    xml_data = """
    <book>
        <title>Python Programming</title>
        <author>Sue Snellings</author>
        <year>2021</year>
    </book>
    """

    handler = SimpleContentHandler()
    sax_handler.parseString(xml_data, handler)

Example 2: Handling Namespace Events

import xml.sax.handler as sax_handler

class NamespacedHandler(sax_handler.ContentHandler):
    def __init__(self):
        self.namespaces = {}

    def startElementNS(self, name, qname, attrs):
        # This method is called when an element starts, including namespace information.
        prefix, local_name = name
        print(f"Start Element with Namespace: {prefix}:{local_name}, Attributes: {attrs}")
        if prefix:
            self.namespaces[local_name] = f"{prefix}:{qname}"

    def endElementNS(self, name, qname):
        # This method is called when an element ends.
        prefix, local_name = name
        print(f"End Element with Namespace: {prefix}:{local_name}")

# Example usage
if __name__ == "__main__":
    xml_data = """
    <book xmlns:bk="http://example.com/book">
        <bk:title>Python Programming</bk:title>
        <bk:author>Sue Snellings</bk:author>
    </book>
    """

    handler = NamespacedHandler()
    sax_handler.parseString(xml_data, handler)

Example 3: Implementing an ErrorHandler

import xml.sax.handler as sax_handler

class BasicErrorHandler(sax_handler.ErrorHandler):
    def error(self, exception):
        # This method is called for each parsing error.
        print(f"Error: {exception}")

    def fatalError(self, exception):
        # This method is called for each fatal parsing error.
        print(f"Fatal Error: {exception}")
        # Exit the program
        import sys
        sys.exit(1)

# Example usage
if __name__ == "__main__":
    xml_data = """
    <book>
        <title>Python Programming</title>
        <author>Sue Snellings</author>
        </book>
    """

    handler = BasicErrorHandler()
    sax_handler.parseString(xml_data, handler)

Example 4: Handling XML Processing Instructions

import xml.sax.handler as sax_handler

class PIHandler(sax_handler.ContentHandler):
    def processingInstruction(self, target, data):
        # This method is called for each XML processing instruction found in the document.
        print(f"Processing Instruction: Target={target}, Data={data}")

# Example usage
if __name__ == "__main__":
    xml_data = """
    <?xml version="1.0"?>
    <book>
        <title>Python Programming</title>
        <!-- This is a comment -->
        <?xml-stylesheet type="text/xsl" href="style.xsl"?>
        </book>
    """

    handler = PIHandler()
    sax_handler.parseString(xml_data, handler)

Example 5: Using NamespaceResolver

import xml.sax.handler as sax_handler

class CustomNamespaceResolver(sax_handler.NamespaceResolver):
    def getPrefix(self, uri):
        # This method is called to resolve a namespace URI.
        if uri == 'http://example.com/book':
            return 'bk'
        else:
            return None

# Example usage
if __name__ == "__main__":
    xml_data = """
    <book xmlns:bk="http://example.com/book">
        <bk:title>Python Programming</bk:title>
        <bk:author>Sue Snellings</bk:author>
    </book>
    """

    resolver = CustomNamespaceResolver()
    handler = sax_handler.ContentHandler()
    handler.setNamespaceResolver(resolver)
    sax_handler.parseString(xml_data, handler)

These examples demonstrate how to implement various handlers using the xml.sax.handler module. Each example covers a specific functionality and provides clear instructions on how to use it effectively.

xml.sax.saxutils - SAX Utilities.md

xml.sax.saxutils - SAX Utilities

Below are comprehensive code examples for using the xml.sax.saxutils module from Python's standard library, which provides utilities for XML parsing and string manipulation.

1. Escape Characters in XML

from xml.sax.saxutils import escape

# Input string containing special characters
input_string = '<"&><>/'

# Escaping special characters for XML output
escaped_string = escape(input_string)

print(f"Original String: {input_string}")
print(f"Escaped String: {escaped_string}")

2. Unescape Characters in XML

from xml.sax.saxutils import unescape

# Input string containing escaped entities
escaped_string = '&lt;"&amp;&gt;&amp;quot;&amp;apos;'  # Example of a long escape sequence

# Unescaping special characters from XML input
unescaped_string = unescape(escaped_string)

print(f"Escaped String: {escaped_string}")
print(f"Unescaped String: {unescaped_string}")

3. Entity Encoding

from xml.sax.saxutils import entityEscape

# Input string containing special characters
input_string = 'The &quot;quick&quot; brown fox jumps over the &lt;lazy&gt; dog.'

# Entity encoding special characters for XML output
encoded_string = entityEscape(input_string)

print(f"Original String: {input_string}")
print(f"Encoded String: {encoded_string}")

4. HTML Character Entities

from xml.sax.saxutils import htmlEntityDecode

# Input string containing HTML character entities
html_encoded_string = 'The &quot;quick&quot; brown fox jumps over the &lt;lazy&gt; dog.'

# Decoding HTML character entities to their corresponding characters
decoded_string = htmlEntityDecode(html_encoded_string)

print(f"Encoded String: {html_encoded_string}")
print(f"Decoded String: {decoded_string}")

5. XML Character Reference Entities

from xml.sax.saxutils import xmlcharrefreplace

# Input string containing XML character reference entities
xml_entity_string = 'The &quot;quick&quot; brown fox jumps over the &lt;lazy&gt; dog.'

# Replacing XML character reference entities with their corresponding characters
replaced_string = xmlcharrefreplace(xml_entity_string)

print(f"Original String: {xml_entity_string}")
print(f"Replaced String: {replaced_string}")

6. XML Namespace Mapping

from xml.sax.saxutils import prepare_input_source

# Input string with namespaces
input_string = """
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <child xsi:type="typeA">Content</child>
</root>
"""

# Preparing input source for XML parsing
input_source = prepare_input_source(input_string)

print(f"Input Source: {input_source}")

7. XML Character Reference Replacement

from xml.sax.saxutils import characterEntityResolver

# Function to resolve character entities to their corresponding characters
def custom_resolver(public_id, system_id):
    # Example mapping for HTML special characters
    if public_id == "-//W3C//DTD HTML 4.01 Transitional//EN":
        return {"&lt;": "<", "&gt;": ">", "&amp;": "&"}
    return None

# Setting up the custom character entity resolver
resolver = characterEntityResolver(custom_resolver)

print(f"Custom Resolver: {resolver}")

8. XML Character Reference Replacement with XML Namespace

from xml.sax.saxutils import prepare_input_source, resolve_entity

# Input string with namespaces and character entities
input_string = """
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <child xsi:type="typeA">Content &amp; more content</child>
</root>
"""

# Preparing input source for XML parsing
input_source = prepare_input_source(input_string)

# Resolving entities in the input source using the resolver
resolved_input = resolve_entity(input_source, "more content")

print(f"Original Input: {input_source}")
print(f"Resolved Input: {resolved_input}")

These examples demonstrate various functionalities of the xml.sax.saxutils module, including escaping and unescaping characters, encoding HTML entities, handling XML namespace mappings, and using custom character entity resolvers. Each example is accompanied by comments for clarity.

xml.sax.xmlreader - Interface for XML parsers.md

xml.sax.xmlreader - Interface for XML parsers

The xml.sax.xmlreader module provides an interface for parsing XML documents using SAX (Simple API for XML). It allows you to read and process XML data in a more memory-efficient manner by processing only parts of the document as needed. Below are comprehensive examples demonstrating various functionalities provided by this module.

1. Using the XMLReader Interface

The XMLReader interface is the central class for parsing XML documents with SAX. Here's how you can use it to parse an XML file:

from xml.sax import make_parser, ContentHandler

class MyContentHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"Start element: {name}")
        if 'id' in attrs:
            print(f"ID attribute: {attrs['id']}")

    def endElement(self, name):
        print(f"End element: {name}")

def parse_xml(file_path):
    # Create an XML parser
    parser = make_parser()

    # Set the content handler for parsing
    handler = MyContentHandler()
    parser.setContentHandler(handler)

    try:
        # Parse the XML file
        parser.parse(file_path)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml('example.xml')

2. Customizing Content Handling

You can customize the behavior of the ContentHandler by overriding specific methods. Here's an example that prints all text nodes found in the XML:

class TextPrinter(ContentHandler):
    def characters(self, content):
        print(content.strip())

def parse_xml_with_text(file_path):
    parser = make_parser()
    handler = TextPrinter()
    parser.setContentHandler(handler)

    try:
        parser.parse(file_path)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml_with_text('example.xml')

3. Handling Namespaces

SAX also supports namespaces, which can be accessed through the Attributes object:

class NamespaceHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"Start element: {name} (Namespace: {attrs.namespaceURI})")

def parse_xml_with_namespaces(file_path):
    parser = make_parser()
    handler = NamespaceHandler()
    parser.setContentHandler(handler)

    try:
        parser.parse(file_path)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml_with_namespaces('example.xml')

4. Handling Entity References

Entity references are handled in SAX by the startEntity and endEntity methods:

class EntityHandler(ContentHandler):
    def startEntity(self, name):
        print(f"Start entity: {name}")

    def endEntity(self, name):
        print(f"End entity: {name}")

def parse_xml_with_entities(file_path):
    parser = make_parser()
    handler = EntityHandler()
    parser.setContentHandler(handler)

    try:
        parser.parse(file_path)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml_with_entities('example.xml')

5. Using the xml.sax.expatreader Module

The expatreader module provides a SAX-based parser that uses Expat, which is a fast and simple parser for XML.

from xml.sax import make_parser, ContentHandler

class ExpatContentHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"Start element: {name}")

def parse_xml_with_expat(file_path):
    # Create an Expat-based XML parser
    parser = make_parser(use_expat=True)

    handler = ExpatContentHandler()
    parser.setContentHandler(handler)

    try:
        parser.parse(file_path)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml_with_expat('example.xml')

6. Handling Validation

SAX parsers can be configured to perform validation against a schema:

from xml.sax import make_parser, ContentHandler, XMLReader
from xml.dom.minidom import parseString

class ValidatingContentHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"Start element: {name}")

def parse_xml_with_validation(file_path, schema_file):
    parser = make_parser(use_expat=True)
    parser.setFeature('http://xml.org/sax/features/validation', True)

    # Load the schema
    with open(schema_file, 'rb') as f:
        schema_content = f.read()

    # Parse and validate the XML file
    try:
        dom = parseString(schema_content + b'\n' + open(file_path, 'rb').read())
        handler = ValidatingContentHandler()
        parser.setContentHandler(handler)
        parser.parse(dom)
    except Exception as e:
        print(f"Error parsing XML: {e}")

# Example usage
parse_xml_with_validation('example.xml', 'schema.xsd')

These examples demonstrate various ways to use the xml.sax.xmlreader module to parse and process XML data in Python. You can adapt these examples to fit your specific requirements, such as handling different types of XML documents or integrating them into larger applications.