From 619b2b719913d58a4eb299d723af45a2777add3e Mon Sep 17 00:00:00 2001 From: StableLlama Date: Thu, 17 Jul 2025 22:02:34 +0200 Subject: [PATCH] Optimize README --- README.md | 542 ++++++++++++++++++------------------------------------ 1 file changed, 178 insertions(+), 364 deletions(-) diff --git a/README.md b/README.md index ede3c08..4c9d914 100644 --- a/README.md +++ b/README.md @@ -1,376 +1,190 @@ -# Basic data handling +# Basic Data Handling -Basic Python functions for manipulating data that every programmer is used to. - -These nodes are very lightweight and require no additional dependencies. +Basic Python functions for manipulating data that every programmer is used to. These nodes are very lightweight and +require no additional dependencies. ## Quickstart -### Recommended +### Recommended Installation + +1. Install [ComfyUI](https://docs.comfy.org/get_started) +2. Install [ComfyUI-Manager](https://github.com/ltdrdata/ComfyUI-Manager) +3. Look up the "Basic data handling" extension in ComfyUI-Manager +4. Restart ComfyUI + +### Alternative (Manual Installation) -1. Install [ComfyUI](https://docs.comfy.org/get_started). -1. Install [ComfyUI-Manager](https://github.com/ltdrdata/ComfyUI-Manager) -1. Look up the "Basic data handling" extension in ComfyUI-Manager. -1. Restart ComfyUI. +1. Install [ComfyUI](https://docs.comfy.org/get_started) +2. Clone this repository under `ComfyUI/custom_nodes` +3. Restart ComfyUI -### Alternative (manual installation) +## Node Categories -1. Install [ComfyUI](https://docs.comfy.org/get_started). -1. Clone this repository under `ComfyUI/custom_nodes`. -1. Restart ComfyUI. +### BOOLEAN -# Features +Boolean logic operations: -## Nodes +- **Logic operations**: and, or, not, xor, nand, nor -### BOOLEAN: Boolean logic nodes -- Logic operations: and, or, not, xor, nand, nor +### Cast -### cast: Type conversion nodes for ComfyUI data types -- Basic data type conversions: +Type conversion nodes for ComfyUI data types: + +- **Basic data type conversions**: - to BOOLEAN - Converts any input to a Boolean using Python's truthy/falsy rules - - to FLOAT - Converts numeric input to a floating-point number (raises ValueError for invalid inputs) - - to INT - Converts numeric input to an integer (raises ValueError for invalid inputs) - - to STRING - Converts any input to a string using Python's str() function -- Collection type conversions: - - to DICT - Converts compatible inputs (mappings or lists of key-value pairs) to a dictionary - - to LIST - Converts input to a LIST (wraps single items in a list, preserves existing lists) - - to SET - Converts input to a SET (creates a set from single items or collections, removing duplicates) - -### Comparison: Value comparison nodes -- Basic comparisons: equal (==), not equal (!=), greater than (>), greater than or equal (>=), less than (<), less than or equal (<=) -- String comparison: StringComparison node with case-sensitive/insensitive options and various operators (==, !=, >, <, >=, <=) -- Special comparisons: NumberInRange (check if a value is within specified bounds), IsNull (check if a value is null) -- Container operations: CompareLength (compare the length of strings, lists, and other containers) - -### data list: ComfyUI list manipulation nodes (for processing individual items) -- Creation: - - create Data List - Generic creation from any type inputs (dynamically expandable) - - Type-specific creation: - - create Data List from BOOLEANs - Creates a data list from Boolean values - - create Data List from FLOATs - Creates a data list from floating-point values - - create Data List from INTs - Creates a data list from integer values - - create Data List from STRINGs - Creates a data list from string values -- Modification: - - append - Adds an item to the end of a data list - - extend - Combines elements from multiple data lists - - insert - Inserts an item at a specified position - - set item - Replaces an item at a specified position - - remove - Removes the first occurrence of a specified value - - pop - Removes and returns an item at a specified position - - pop random - Removes and returns a random element -- Filtering: - - filter - Filters a data list using boolean values - - filter select - Separates items into two lists based on boolean filters -- Access: - - get item - Retrieves an item at a specified position - - first - Returns the first element in a data list - - last - Returns the last element in a data list - - slice - Creates a subset of a data list using start/stop/step parameters - - index - Finds the position of a value in a data list - - contains - Checks if a data list contains a specified value -- Information: - - length - Returns the number of items in a data list - - count - Counts occurrences of a value in a data list -- Operations: - - sort - Orders items (with optional reverse parameter) - - reverse - Reverses the order of items - - zip - Combines multiple data lists element-wise - - min - Finds the minimum value in a list of numbers - - max - Finds the maximum value in a list of numbers -- Conversion: - - convert to LIST - Converts a data list to a LIST object - - convert to SET - Converts a data list to a SET (removing duplicates) - -### DICT: Dictionary manipulation nodes -- Creation: create (generic and type-specific versions), create from items (data list and LIST versions), create from lists, fromkeys -- Access: get, get_multiple, keys, values, items -- Modification: set, update, setdefault, merge -- Removal: pop, popitem, pop random, remove -- Information: length, contains_key -- Operations: filter_by_keys, exclude_keys, invert, compare -- Conversion: get_keys_values - -### FLOAT: Floating-point operation nodes -- Creation: create FLOAT from string -- Basic arithmetic: add, subtract, multiply, divide, divide (zero safe), power -- Formatting: round (to specified decimal places) -- Conversion: to_hex (hexadecimal representation), from_hex (create from hex string) -- Analysis: is_integer (check if float has no fractional part), as_integer_ratio (get numerator/denominator) - -### Flow Control: Workflow control nodes -- Conditional branching: - - if/else - Basic conditional that returns one of two values based on a condition - - if/elif/.../else - Extended conditional with multiple conditions and outcomes -- Selection: - - switch/case - Selects from multiple options based on an integer index - - flow select - Directs a value to either "true" or "false" output path based on a condition -- Execution control: - - force execution order - Coordinates the execution sequence of nodes in a workflow - -### INT: Integer operation nodes -- Creation: create INT (from string), create INT with base (convert string with specified base) -- Basic arithmetic: add, subtract, multiply, divide, divide (zero safe), modulus, power -- Bit operations: bit_length (bits needed to represent number), bit_count (count of 1 bits) -- Byte conversion: to_bytes (convert integer to bytes), from_bytes (convert bytes to integer) - -### LIST: Python list manipulation nodes (as a single variable) -- Creation: create LIST (generic), create from type-specific values (BOOLEANs, FLOATs, INTs, STRINGs) -- Modification: append, extend, insert, remove, pop, pop random, set_item -- Access: get_item, first, last, slice, index, contains -- Information: length, count -- Operations: sort (with optional reverse), reverse, min, max -- Conversion: convert to data list, convert to SET - -### Math: Mathematical operations -- Trigonometric functions: - - Basic: sin, cos, tan - Calculate sine, cosine, and tangent of angles (in degrees or radians) - - Inverse: asin, acos, atan - Calculate inverse sine, cosine, and tangent (returns degrees or radians) - - Special: atan2 - Calculate arc tangent of y/x with correct quadrant handling -- Logarithmic/Exponential functions: - - log - Natural logarithm (base e) with optional custom base - - log10 - Base-10 logarithm - - exp - Exponential function (e^x) - - sqrt - Square root -- Constants: - - pi - Mathematical constant π (3.14159...) - - e - Mathematical constant e (2.71828...) -- Angle conversion: - - degrees - Convert radians to degrees - - radians - Convert degrees to radians -- Rounding operations: - - floor - Return largest integer less than or equal to input - - ceil - Return smallest integer greater than or equal to input -- Min/Max functions: - - min - Return minimum of two values - - max - Return maximum of two values -- Other: - - abs - Absolute value (magnitude without sign) - -### path: File system path manipulation nodes -- Basic operations: - - join - Joins multiple path components intelligently with correct separators - - split - Splits a path into directory and filename components - - splitext - Splits a path into name and extension components - - basename - Extracts the filename component from a path - - dirname - Extracts the directory component from a path - - normalize - Collapses redundant separators and resolves up-level references -- Path information: - - abspath - Returns the absolute (full) path by resolving relative components - - exists - Checks if a path exists in the filesystem - - is_file - Checks if a path points to a regular file - - is_dir - Checks if a path points to a directory - - is_absolute - Checks if a path is absolute (begins at root directory) - - get_size - Returns the size of a file in bytes - - get_extension - Extracts the file extension from a path (including the dot) - - set_extension - Replaces or adds a file extension to a path -- Directory operations: - - list_dir - Lists files and directories in a specified path with filtering options - - get_cwd - Returns the current working directory -- Path searching: - - glob - Finds paths matching a pattern with wildcard support - - common_prefix - Finds the longest common leading component of given paths -- Path conversions: - - relative - Computes a relative path from a start path to a target path - - expand_vars - Replaces environment variables in a path with their values -- File loading: - - load STRING from file - Loads a text file and returns its content as a STRING - - load IMAGE from file (RGB) - Loads an image and returns RGB channels as a tensor - - load IMAGE+MASK from file (RGBA) - Loads an image and returns RGB channels as a tensor and alpha channel as a mask - - load MASK from alpha channel - Loads an image and extracts its alpha channel as a mask - - load MASK from greyscale/red - Loads an image and creates a mask from its greyscale or red channel -- File saving: - - save STRING to file - Saves a string to a text file with optional directory creation - - save IMAGE to file - Saves an image tensor to a file in various formats (PNG, JPG, WEBP, JXL) - - save IMAGE+MASK to file - Saves an image with transparency using a mask as the alpha channel - -### SET: Python set manipulation nodes (as a single variable) -- Creation: - - create SET - Generic creation from any type inputs (dynamically expandable) - - Type-specific creation: - - create SET from BOOLEANs - Creates a set from Boolean values - - create SET from FLOATs - Creates a set from floating-point values - - create SET from INTs - Creates a set from integer values - - create SET from STRINGs - Creates a set from string values -- Modification: - - add - Adds an item to a set - - remove - Removes an item from a set (raises error if not present) - - discard - Removes an item if present (no error if missing) - - pop - Removes and returns an arbitrary element - - pop random - Removes and returns a random element -- Information: - - length - Returns the number of items in a set - - contains - Checks if a set contains a specified value -- Set operations: - - union - Combines elements from multiple sets - - intersection - Returns elements common to all input sets - - difference - Returns elements in first set but not in second set - - symmetric_difference - Returns elements in either set but not in both -- Set comparison: - - is_subset - Checks if first set is a subset of second set - - is_superset - Checks if first set is a superset of second set - - is_disjoint - Checks if two sets have no common elements -- Conversion: - - convert to data list - Converts a SET to a ComfyUI data list - - convert to LIST - Converts a SET to a LIST - -### STRING: String manipulation nodes -Available nodes grouped by functionality: - -#### Text case conversion -- capitalize - Converts first character to uppercase, rest to lowercase -- casefold - Aggressive lowercase for case-insensitive comparisons -- lower - Converts string to lowercase -- swapcase - Swaps case of all characters -- title - Converts string to titlecase -- upper - Converts string to uppercase - -#### Text inspection and validation -- contains (in) - Checks if string contains a substring -- endswith - Checks if string ends with a specific suffix -- find - Finds first occurrence of a substring -- length - Returns the number of characters in the string -- rfind - Finds last occurrence of a substring -- startswith - Checks if string starts with a specific prefix - -#### Character type checking -- isalnum - Checks if all characters are alphanumeric -- isalpha - Checks if all characters are alphabetic -- isascii - Checks if all characters are ASCII -- isdecimal - Checks if all characters are decimal -- isdigit - Checks if all characters are digits -- isidentifier - Checks if string is a valid Python identifier -- islower - Checks if all characters are lowercase -- isnumeric - Checks if all characters are numeric -- isprintable - Checks if all characters are printable -- isspace - Checks if all characters are whitespace -- istitle - Checks if string is titlecased -- isupper - Checks if all characters are uppercase - -#### Text formatting and alignment -- center - Centers text within specified width -- expandtabs - Replaces tabs with spaces -- ljust - Left-aligns text within specified width -- rjust - Right-aligns text within specified width -- zfill - Pads string with zeros on the left - -#### Text splitting and joining -- join (from data list) - Joins strings from a data list -- join (from LIST) - Joins strings from a LIST -- rsplit (from data list) - Splits string from right into a data list -- rsplit (from LIST) - Splits string from right into a LIST -- split (to data list) - Splits string into a data list -- split (to LIST) - Splits string into a LIST -- splitlines (from data list) - Splits string at line boundaries into a data list -- splitlines (to LIST) - Splits string at line boundaries into a LIST - -#### Text modification -- concat - Combines two strings together -- count - Counts occurrences of a substring -- replace - Replaces occurrences of a substring -- strip - Removes leading and trailing characters -- lstrip - Removes leading characters -- rstrip - Removes trailing characters -- removeprefix - Removes prefix if present -- removesuffix - Removes suffix if present - -#### Encoding and escaping -- decode - Converts bytes-like string to text -- encode - Converts string to bytes -- escape - Converts special characters to escape sequences -- unescape - Converts escape sequences to actual characters -- format_map - Formats string using values from dictionary - -## Understanding data list vs. LIST vs. SET - -ComfyUI has different data types that serve different purposes: - -### 1. data list -- A native ComfyUI list where **items are processed individually** -- Acts like a standard array/list in most programming contexts -- Items can be accessed individually by compatible nodes -- Supports built-in ComfyUI iteration over each item -- Best for: - - Working directly with multiple items in parallel - - Processing each item in a collection separately - - When you need ComfyUI's automatic iteration functionality - -### 2. LIST -- A Python list passed as a single ComfyUI variable -- Must be processed as a complete unit by compatible nodes -- Operations apply to the entire LIST at once -- Best for: - - Storing and manipulating structured data as a single unit - - When you need to preserve ordered collections - - Passing complex data structures between nodes - -### 3. SET -- A Python set passed as a single ComfyUI variable -- Unordered collection of unique items -- Useful for membership testing, removing duplicates, and set operations -- Best for: - - When you need to ensure uniqueness of items - - Performing mathematical set operations (union, intersection, difference) - - Efficient membership testing (contains operation) - - When item order doesn't matter - -## Control Flow Nodes - -Control flow nodes provide mechanisms to direct the flow of execution in your ComfyUI workflows, allowing for conditional processing and dynamic execution paths. - -### Available Control Flow Nodes: - -#### Conditional Processing -- **if/else** - Routes execution based on a boolean condition -- **if/elif/.../else** - Supports multiple conditional branches -- **switch/case** - Selects from multiple options based on an index - -#### Execution Management -- **disable flow** - Conditionally enables or disables a flow -- **flow select** - Directs output to either "true" or "false" path -- **force calculation** - Prevents caching and forces recalculation -- **force execution order** - Controls the sequence of node execution - -These control flow nodes enable building more complex, dynamic workflows with decision-making capabilities based on runtime conditions. - - Batch processing scenarios - - When you need to apply the same operation to multiple inputs - - When your operation needs to work with individual items separately - -### 2. LIST datatype -- A Python list represented as a **single variable** in the workflow -- Treated as a self-contained object that can be passed between nodes -- Cannot directly connect to nodes that expect individual items -- Best for: - - Working with collections of data as a single unit - - Storing intermediate results that need to be processed as a whole - - Passing collections between different parts of your workflow - - Complex data storage that shouldn't be split apart - -### 3. SET datatype -- A Python set represented as a **single variable** in the workflow -- Stores unique values with no duplicates -- Supports mathematical set operations (union, intersection, etc.) -- Best for: - - Eliminating duplicate values - - Testing membership efficiently - - Set operations (union, difference, etc.) - - When element order doesn't matter - -### When to use which type -- Use **data list** when you need to: - - Process each item individually through ComfyUI nodes - - Allow nodes to iterate through your items automatically - - Connect to nodes that expect individual inputs - - Perform batch processing operations - - -- Use **LIST** when you need: - - Ordered collection with potential duplicates - - To preserve insertion order - - To access elements by position/index - - To use methods like append, extend, etc. - -- Use **SET** when you need: - - Collection of unique values (no duplicates) - - Fast membership testing (x in set) - - Set theory operations (union, intersection) - - To eliminate duplicates from data + - to FLOAT - Converts numeric input to a floating-point number + - to INT - Converts numeric input to an integer + - to STRING - Converts any input to a string +- **Collection type conversions**: + - to DICT - Converts compatible inputs to a dictionary + - to LIST - Converts input to a LIST + - to SET - Converts input to a SET (removing duplicates) + +### Comparison + +Value comparison nodes: + +- **Basic comparisons**: equal (==), not equal (!=), greater than (>), greater than or equal (>=), less than (<), less + than or equal (<=) +- **String comparison**: StringComparison with case-sensitive/insensitive options +- **Special comparisons**: NumberInRange, IsNull +- **Container operations**: CompareLength + +### Control Flow + +Mechanisms to direct workflow execution: + +- **Conditional branching**: + - if/else - Routes based on a boolean condition + - if/elif/.../else - Supports multiple conditional branches + - switch/case - Selects from options based on an index +- **Execution management**: + - disable flow - Conditionally enables/disables a flow + - flow select - Directs output to either "true" or "false" path + - force calculation - Prevents caching and forces recalculation + - force execution order - Controls node execution sequence + +### Data List + +ComfyUI list manipulation nodes (for processing individual items): + +- **Creation**: create Data List (generic and type-specific versions) +- **Modification**: append, extend, insert, set item, remove, pop, pop random +- **Filtering**: filter, filter select +- **Access**: get item, first, last, slice, index, contains +- **Information**: length, count +- **Operations**: sort, reverse, zip, min, max +- **Conversion**: convert to LIST, convert to SET + +### DICT + +Dictionary manipulation nodes: + +- **Creation**: create (generic and type-specific), create from items, create from lists, fromkeys +- **Access**: get, get_multiple, keys, values, items +- **Modification**: set, update, setdefault, merge +- **Removal**: pop, popitem, pop random, remove +- **Information**: length, contains_key +- **Operations**: filter_by_keys, exclude_keys, invert, compare +- **Conversion**: get_keys_values + +### FLOAT + +Floating-point operation nodes: + +- **Creation**: create FLOAT from string +- **Basic arithmetic**: add, subtract, multiply, divide, divide (zero safe), power +- **Formatting**: round (to specified decimal places) +- **Conversion**: to_hex, from_hex +- **Analysis**: is_integer, as_integer_ratio + +### INT + +Integer operation nodes: + +- **Creation**: create INT, create INT with base +- **Basic arithmetic**: add, subtract, multiply, divide, divide (zero safe), modulus, power +- **Bit operations**: bit_length, bit_count +- **Byte conversion**: to_bytes, from_bytes + +### LIST + +Python list manipulation nodes (as a single variable): + +- **Creation**: create LIST (generic and type-specific versions) +- **Modification**: append, extend, insert, remove, pop, pop random, set_item +- **Access**: get_item, first, last, slice, index, contains +- **Information**: length, count +- **Operations**: sort, reverse, min, max +- **Conversion**: convert to data list, convert to SET + +### Math + +Mathematical operations: + +- **Generic**: formula +- **Trigonometric functions**: sin, cos, tan, asin, acos, atan, atan2 +- **Logarithmic/Exponential**: log, log10, exp, sqrt +- **Constants**: pi, e +- **Angle conversion**: degrees, radians +- **Rounding operations**: floor, ceil +- **Min/Max functions**: min, max +- **Other**: abs + +### Path + +File system path manipulation nodes: + +- **Basic operations**: join, split, splitext, basename, dirname, normalize +- **Path information**: abspath, exists, is_file, is_dir, is_absolute, get_size, get_extension, set_extension +- **Directory operations**: list_dir, get_cwd +- **Path searching**: glob, common_prefix +- **Path conversions**: relative, expand_vars +- **File loading**: load STRING from file, load IMAGE from file, load IMAGE+MASK from file, load MASK from alpha + channel, load MASK from greyscale/red +- **File saving**: save STRING to file, save IMAGE to file, save IMAGE+MASK to file + +### SET + +Python set manipulation nodes (as a single variable): + +- **Creation**: create SET (generic and type-specific versions) +- **Modification**: add, remove, discard, pop, pop random +- **Information**: length, contains +- **Set operations**: union, intersection, difference, symmetric_difference +- **Set comparison**: is_subset, is_superset, is_disjoint +- **Conversion**: convert to data list, convert to LIST + +### STRING + +String manipulation nodes: + +- **Text case conversion**: capitalize, casefold, lower, swapcase, title, upper +- **Text inspection**: contains, endswith, find, length, rfind, startswith +- **Character type checking**: isalnum, isalpha, isascii, isdecimal, isdigit, isidentifier, islower, isnumeric, + isprintable, isspace, istitle, isupper +- **Text formatting**: center, expandtabs, ljust, rjust, zfill +- **Text splitting/joining**: join, split, rsplit, splitlines (with data list and LIST variants) +- **Text modification**: concat, count, replace, strip, lstrip, rstrip, removeprefix, removesuffix +- **Encoding/escaping**: decode, encode, escape, unescape, format_map + +### Time + +Date and time manipulation nodes: + +- **DateTime creation/conversion**: TimeNow, TimeToUnix, UnixToTime +- **String formatting/parsing**: TimeFormat, TimeParse +- **Time calculations**: TimeDelta, TimeAddDelta, TimeSubtractDelta, TimeDifference +- **Component extraction**: TimeExtract (year, month, day, hour, etc.) + +## Understanding Data Types + +ComfyUI provides three different collection types that serve distinct purposes: + +### Collection Types and When to Choose Them + +| Type | Description | When to Choose | +|---------------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **data list** | Native ComfyUI list where **items are processed individually** | • When you need ComfyUI to process each item individually
• For batch operations with parallel processing
• When connecting to nodes that expect individual inputs | +| **LIST** | Python list passed as a single variable | • When you need ordered collections with preserved duplicates
• When index-based access is important
• When you need to work with the collection as a complete unit | +| **SET** | Python set passed as a single variable | • When you need to ensure unique values only
• When you need fast membership testing
• For set operations (union, intersection, etc.)
• When element order doesn't matter |