NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1403 most downloaded on PyPI
The kitchen sink of Python utility libraries for doing "stuff" in a functional way. Based on the Lo-Dash Javascript library.
Last release 1 months ago
29 Aug 2026
Release timing varies
gaps range from 3 weeks to 12 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
12 years old
80 releases · first in 2014
Support iterables in take_while and drop_while. Thanks Sai Asish Y!
Support iterables in take_while and drop_while. Thanks Sai Asish Y!
Guard all dunder-path access on objects. Thanks gaoflow_!
Fix flattening nested iterables. Thanks gaoflow_!
Fix StopIteration leak in iterintersperse on empty iterable. Thanks gaoflow_!
Fix in_range to support reversed ranges where start is greater than end by swapping the bounds, matching lodash's documented _.inRange behavior (e.g. in_range(-3, -2, -6) now returns True). Thanks gaoflow_!
Fix floor, ceil, and round_ passing index as precision when used as iteratees. Thanks gaoflow_!
Fix debounce to delay execution until after wait milliseconds of quiet instead of invoking immediately on the first call. Thanks SeaStarDeng_!
Fix to_list returning a dict_values view instead of a list for dicts. Thanks HarperZ9_!
Fix chunk to return empty list when size is less than 1. Thanks santhreal_!
Fix mishandling of out-of-range indexes in pull_at. Thanks santhreal_!
Fix mean, mean_by, and median to return NaN on empty collections. Thanks santhreal_!
Fix last_index_of missing a match at index 0. Thanks uttam12331_!
Fix empty key handling in deep paths. Thanks CodingFeng101_!
One column per quarter.
Prevent access to object paths containing __globals__ or __builtins__ in invoke(). Attempting to access these keys will raise a KeyError``.
Prevent access to object paths containing __globals__ or __builtins__ in invoke(). Attempting to access these keys will raise a ``KeyError.
Fix bug that could result in passing too many arguments to callback functions when the callback contained a var-keyword or keyword-only arguments.
Fix bug that could result in passing too many arguments to callback functions when the callback contained a var-keyword or keyword-only arguments.
Fix bug in zip_object and zip_object_deep where an empty list for keys/values would cause an exception instead of returning an empty dict.
Fix bug in zip_object and zip_object_deep where an empty list for keys/values would cause an exception instead of returning an empty dict.
Specify explicit type parameters for all type annotations. Thanks DeviousStoat_!
Specify explicit type parameters for all type annotations. Thanks DeviousStoat_!
Fix typing issue in map_ for compatability with chain. Thanks DeviousStoat_!
Fix typing issue in map_ for compatability with chain. Thanks DeviousStoat_!
Fix issue where too many arguments were passed to stdlib's operator.attrgetter, operator.itemgetter, and operator.methodcaller when instances of those
Fix issue where too many arguments were passed to stdlib's operator.attrgetter, operator.itemgetter, and operator.methodcaller when instances of those classes were used as callbacks to functions like map_, filter_, etc. due to a bug introduced in Python 3.12.3 and 3.11.9 that reported an incorrect signature for those operator class instances.
Rename function thru to apply. Thanks DeviousStoat_! (breaking change)
Add functions (Thanks DeviousStoat_!):
apply (previously named thru)
apply_catch
apply_if
apply_if_not_none
eq_cmp
gt_cmp
gte_cmp
in_range_cmp
is_equal_cmp
is_equal_with_cmp
is_instance_of_cmp
is_match_cmp
is_match_with_cmp
is_monotone_cmp
lt_cmp
lte_cmp
Rename function thru to apply. Thanks DeviousStoat_! (breaking change)
Changed zip_, unzip, zip_with, unzip_with and to_pairs to accept iterables of tuples instead of lists and return lists of tuples instead of lists of lists. Thanks DeviousStoat_! (breaking change)
Fixed bug in divide, multiply, and subtract that returned the wrong result when 0 was used as one of the operation values. Thanks DeviousStoat_!
Fix bug in function wrappers that incorrectly computed the number of arguments the wrapped function could handle. Thanks DeviousStoat_!
Fix bug in function wrappers that incorrectly computed the number of arguments the wrapped function could handle. Thanks DeviousStoat_!
Fix bug in set_ where the incorrect object type, list instead of dict, was initialized on class attributes. Thanks DeviousStoat_!
Drop support for Python 3.7.
Fix typing for chaining interface for methods that use varargs. Thanks DeviousStoat_!
Fix typing for chaining interface for methods that use varargs. Thanks DeviousStoat_!
Fix typing for find_index and find_last_index by allowing predicate argument to be callback shorthand values. Thanks DeviousStoat_!
Fix typing for find_index and find_last_index by allowing predicate argument to be callback shorthand values. Thanks DeviousStoat_!
Exclude incompatible typing-extensions version 4.6.0 from install requirements. Incompatibility was fixed in 4.6.1.
Exclude incompatible typing-extensions version 4.6.0 from install requirements. Incompatibility was fixed in 4.6.1.
Fix typing for difference_by, intersection_by, union_by, uniq_by, and xor_by by allowing iteratee argument to be Any. Thanks DeviousStoat_!
Fix typing for difference_by, intersection_by, union_by, uniq_by, and xor_by by allowing iteratee argument to be Any. Thanks DeviousStoat_!
Fix issue where using pyright as a type checker with reportPrivateUsage=true would report errors that objects are not exported from pydash. Thanks Dev
Fix issue where using pyright as a type checker with reportPrivateUsage=true would report errors that objects are not exported from pydash. Thanks DeviousStoat_!
Fix missing install dependency, typing-extensions, for package.
Fix missing install dependency, typing-extensions, for package.
Raise an issue for any typing issues at https://github.com/dgilland/pydash/issues. Thanks DeviousStoat_! (breaking change)
Add type annotations to package. Raise an issue for any typing issues at https://github.com/dgilland/pydash/issues. Thanks DeviousStoat_! (breaking change)
Change behavior of to_dict to not using dict() internally. Previous behavior would be for something like to_dict([["k", "v"], ["x", "y"]]) to return {"k": "v", "x": "y"} (equivalent to calling dict(...)) but to_dict([["k"], ["v"], ["x"], ["y"]]) would return {0: ["x"], 1: ["v"], 2: ["x"], 3: ["y"]}. The new behavior is to always return iterables as dictionaries with their indexes as keys like {0: ["k", "v"], 1: ["x", "y"]}. This is consistent with how iterable objects are iterated over and means that to_dict will have more reliable output. (breaking change)
Change behavior of slugify to remove single-quotes from output. Instead of slugify("the cat's meow") == "the-cat's-meow", the new behavior is to return "the-cats-meow". (breaking change)
Add support for negative indexes in get path keys. Thanks bl4ckst0ne_!
Only prevent access to object paths containing __globals__ or __builtins__ instead of all dunder-methods for non-dict/list objects.
Only prevent access to object paths containing __globals__ or __builtins__ instead of all dunder-methods for non-dict/list objects.
Fix exception raised due to mishandling of non-string keys in functions like get() for non-dict/list objects that used integer index references like "
Fix exception raised due to mishandling of non-string keys in functions like get() for non-dict/list objects that used integer index references like "[0]".
Access to dict keys are unaffected (e.g. get({"__init__": True}, "__init__") will return True). (breaking change)
Prevent access to object paths containing dunder-methods in functions like get() for non-dict/list objects. Attempting to access dunder-methods using get-path keys will raise a KeyError (e.g. get(SomeClass(), '__init__' will raise). Access to dict keys are unaffected (e.g. get({"__init__": True}, "__init__") will return True). (breaking change)
Add support for Python 3.11.
Drop support for Python 3.6 (breaking change)
Remove unnecessary type check and conversion for exceptions argument in pydash.retry.
Remove unnecessary type check and conversion for exceptions argument in pydash.retry.
Fix timing assertion issue in test for pydash.delay where it could fail on certain environments.
Add support for Python 3.10.
Fix timing assertion issue in test for pydash.delay where it could fail on certain environments.
Support matches-style callbacks on non-dictionary objects that are compatible with pydash.get in functions like pydash.find.
Support matches-style callbacks on non-dictionary objects that are compatible with pydash.get in functions like pydash.find.
Fix compatibility issue between pydash.py_ / pydash._ and typing.Protocol + typing.runtime_checkable that caused an exception to be raised for isinsta
Fix compatibility issue between pydash.py_ / pydash._ and typing.Protocol + typing.runtime_checkable that caused an exception to be raised for isinstance(py_, SomeRuntimeCheckableProtocol).
Fix bug in merge_with that prevented custom iteratee from being used when recursively merging. Thanks weineel_!
Fix bug in merge_with that prevented custom iteratee from being used when recursively merging. Thanks weineel_!
Drop support for Python 2.7. (breaking change)
Drop support for Python 2.7. (breaking change)
Improve Unicode word splitting in string functions to be inline with Lodash. Thanks mervynlee94_! (breaking change)
camel_case
human_case
kebab_case
lower_case
pascal_case
separator_case
slugify
snake_case
start_case
upper_case
Optimize regular expression constants used in pydash.strings by pre-compiling them to regular expression pattern objects.
Fix regression introduced in v4.8.0 that caused merge and merge_with to raise an exception when passing None as the first argument.
Fix regression introduced in v4.8.0 that caused merge and merge_with to raise an exception when passing None as the first argument.
Fix regression introduced in v4.9.1 that broke pydash.get for dictionaries and dot-delimited keys that reference integer dict-keys.
Fix regression introduced in v4.9.1 that broke pydash.get for dictionaries and dot-delimited keys that reference integer dict-keys.
Fix bug in get/has that caused defaultdict objects to get populated on key access.
Fix bug in get/has that caused defaultdict objects to get populated on key access.
Add default_to_any. Thanks gonzalonaveira_!
Add default_to_any. Thanks gonzalonaveira_!
Fix mishandling of key names containing \. in set_, set_with, and update_with where the . was not treated as a literal value within the key name. Thanks zhaowb_!
Support attribute based setters like argparse.Namespace in set_, set_with, update, and update_with.
Support attribute based setters like argparse.Namespace in set_, set_with, update, and update_with.
Fix exception in order_by when None used as a sort key. Thanks elijose55_!
Fix behavior of pick_by to return the passed in argument when only one argument given. Previously, an empty dictionary was returned. Thanks elijose55_!
Officially support Python 3.8.
Fix handling of Sequence, Mapping, and namedtuple types in get so that their attributes aren't accessed during look-up. Thanks jwilson8767_!
Fix handling of Sequence, Mapping, and namedtuple types in get so that their attributes aren't accessed during look-up. Thanks jwilson8767_!
Fix handling of string and byte values in clone_with and clone_deep_with when a customizer is used.
Fix handling of string and byte values in clone_with and clone_deep_with when a customizer is used.
Fix handling of non-indexable iterables in find and find_last.
Raise an explicit exception in set_, set_with, update, and update_with when an object cannot be updated due to that object or one of its nested object
Raise an explicit exception in set_, set_with, update, and update_with when an object cannot be updated due to that object or one of its nested objects not being subscriptable.
Fix bug in spread where arguments were not being passed to wrapped function properly.
Fix bug in spread where arguments were not being passed to wrapped function properly.
Modify to_dict to first try to convert using dict() before falling back to using pydash.helpers.iterator().
Modify to_dict to first try to convert using dict() before falling back to using pydash.helpers.iterator().
Misc ++++ - Internal code optimizations.
Internal code optimizations.
Misc ++++ - Support Python 3.7.
Support Python 3.7.
Improve performance of the following functions for large datasets:
Improve performance of the following functions for large datasets:
duplicates
sorted_uniq
sorted_uniq_by
union
union_by
union_with
uniq
uniq_by
uniq_with
xor
xor_by
xor_with
New Features ++++++++++++ - Add jitter argument to retry.
Add jitter argument to retry.
Add attempt argument to on_exception callback in retry. New function signature is on_exception(exc, attempt) (previously was on_exception(exc)). All a
Add attempt argument to on_exception callback in retry. New function signature is on_exception(exc, attempt) (previously was on_exception(exc)). All arguments to on_exception callback are now optional.
Add retry decorator that will retry a function multiple times if the function raises an exception.
Add retry decorator that will retry a function multiple times if the function raises an exception.
Fix regression in v4.3.2 introduced by the support added for callable class callbacks that changed the handling of callbacks that could not be inspect
Fix regression in v4.3.2 introduced by the support added for callable class callbacks that changed the handling of callbacks that could not be inspected. Prior to v4.3.2, these callbacks would default to being passed a single callback argument, but with v4.3.2 these callbacks would be passed the full set of callback arguments which could result an exception being raised due to the callback not supporting that many arguments.
Fix issue in defaults_deep where sources with non-dict values would raise an exception due to assumption that object was always a dict.
Fix issue in defaults_deep where sources with non-dict values would raise an exception due to assumption that object was always a dict.
Fix issue in curry where too many arguments would be passed to the curried function when evaluating function if too many arguments used in last function call.
Workaround issue in Python 2.7 where callable classes used as callbacks were always passed the full count of arguments even when the callable class only accept a subset of arguments.
Fix set_with so that callable values are not called when being set. This bug also impacted the following functions by proxy:
Fix set_with so that callable values are not called when being set. This bug also impacted the following functions by proxy:
pick
pick_by
set_
transpose
zip_object_deep
Wrap non-iterables in a list in to_list instead of raising an exception. Thanks efenka_!
Add nest.
Wrap non-iterables in a list in to_list instead of raising an exception. Thanks efenka_!
Add split_strings argument to to_list to control whether strings are coverted to a list (split_strings=True) or wrapped in a list (split_strings=False). Default is split_strings=True. Thanks efenka_!
Ensure that to_path always returns a list.
Ensure that to_path always returns a list.
Fix get to work with path values other than just strings, integers, and lists.
Support more iterator "hooks" in to_dict so non-iterators that expose an items(), iteritems(), or has __dict__ attributes will be converted using thos
Support more iterator "hooks" in to_dict so non-iterators that expose an items(), iteritems(), or has __dict__ attributes will be converted using those methods.
Support deep paths in omit and omit_by. Thanks beck3905_!
Support deep paths in pick and pick_by. Thanks beck3905_!
Fix missing argument passing to matched function in cond.
Support passing a single list of pairs in cond instead of just pairs as separate arguments.
Add properties function that returns list of path values for an object.
Officially support Python 3.6.
Add properties function that returns list of path values for an object.
Add replace_end.
Add replace_start.
Make iteratee support properties-style callback when a tuple is passed.
Make replace accept from_start and from_end arguments to limit replacement to start and/or end of string.
None
Improve performance of get. Thanks shaunpatterson_!
None
Improve performance of get. Thanks shaunpatterson_!
Fix regression in get where list and dict objects had attributes returned when a key was missing but the key corresponded to an attribute name. For ex
None
Fix regression in get where list and dict objects had attributes returned when a key was missing but the key corresponded to an attribute name. For example, pydash.get({}, 'update') would return {}.update() instead of None. Previous behavior was that only item-access was allowed for list and dict which has been restored.
Fix regression in invoke/invoke_map where non-attributes could be invoked. For example, pydash.invoke({'items': lambda: 1}, 'items') would return 1 instead of dict_items([('a', 'items')]). Previous behavior was that only attribute methods could be invoked which has now been restored.
Fix regression in intersection, intersection_by, and intersection_with introduced in v4.0.0 where the a single argument supplied to intersection shoul
None
Fix regression in intersection, intersection_by, and intersection_with introduced in v4.0.0 where the a single argument supplied to intersection should return the same argument value instead of an empty list.
None
Make property_ work with deep path strings.
Make property_ work with deep path strings.
Revert removal of deep_pluck and rename to pluck. Previously, deep_pluck was removed and map_ was recommended as a replacement. However, deep_pluck (now defined as pluck) functionality is not supported by map_ so the removal pluck was reverted.
Remove property_deep (use property_).
Make add only support two argument addition. (breaking change)
Add assign_with.
Add clamp.
Add clone_deep_with.
Add clone_with.
Add cond. Thanks bharadwajyarlagadda_!
Add conforms.
Add conforms_to.
Add default_to. Thanks bharadwajyarlagadda_!
Add difference_by.
Add difference_with.
Add divide. Thanks bharadwajyarlagadda_!
Add eq. Thanks bharadwajyarlagadda_!
Add flat_map.
Add flat_map_deep.
Add flat_map_depth.
Add flatten_depth.
Add flip. Thanks bharadwajyarlagadda_!
Add from_pairs. Thanks bharadwajyarlagadda_!
Add intersection_by.
Add intersection_with.
Add invert_by.
Add invoke_map.
Add is_equal_with. Thanks bharadwajyarlagadda_!
Add is_match_with.
Add is_set. Thanks bharadwajyarlagadda_!
Add lower_case. Thanks bharadwajyarlagadda_!
Add lower_first. Thanks bharadwajyarlagadda_!
Add max_by.
Add mean_by.
Add merge_with.
Add min_by.
Add multiply. Thanks bharadwajyarlagadda_!
Add nth. Thanks bharadwajyarlagadda_!
Add nth_arg. Thanks bharadwajyarlagadda_!
Add omit_by.
Add over. Thanks bharadwajyarlagadda_!
Add over_every. Thanks bharadwajyarlagadda_!
Add over_some. Thanks bharadwajyarlagadda_!
Add pick_by.
Add pull_all. Thanks bharadwajyarlagadda_!
Add pull_all_by.
Add pull_all_with.
Add range_right. Thanks bharadwajyarlagadda_!
Add sample_size. Thanks bharadwajyarlagadda_!
Add set_with.
Add sorted_index_by.
Add sorted_index_of. Thanks bharadwajyarlagadda_!
Add sorted_last_index_by.
Add sorted_last_index_of.
Add sorted_uniq. Thanks bharadwajyarlagadda_!
Add sorted_uniq_by.
Add stub_list. Thanks bharadwajyarlagadda_!
Add stub_dict. Thanks bharadwajyarlagadda_!
Add stub_false. Thanks bharadwajyarlagadda_!
Add stub_string. Thanks bharadwajyarlagadda_!
Add stub_true. Thanks bharadwajyarlagadda_!
Add subtract. Thanks bharadwajyarlagadda_!
Add sum_by.
Add to_integer.
Add to_lower. Thanks bharadwajyarlagadda_!
Add to_path. Thanks bharadwajyarlagadda_!
Add to_upper. Thanks bharadwajyarlagadda_!
Add unary.
Add union_by. Thanks bharadwajyarlagadda_!
Add union_with. Thanks bharadwajyarlagadda_!
Add uniq_by.
Add uniq_with.
Add unset.
Add update.
Add update_with.
Add upper_case. Thanks bharadwajyarlagadda_!
Add upper_first. Thanks bharadwajyarlagadda_!
Add xor_by.
Add xor_with.
Add zip_object_deep.
Make function returned by constant ignore extra arguments when called.
Make get support attribute access within path.
Make iteratee treat an integer argument as a string path (i.e. iteratee(1) is equivalent to iteratee('1') for creating a path accessor function).
Make intersection work with unhashable types.
Make range_ support decrementing when start argument is greater than stop argument.
Make xor maintain sort order of supplied arguments.
Fix find_last_key so that it iterates over object in reverse.
Make add only support two argument addition. (breaking change)
Make difference return duplicate values from first argument and maintain sort order. (breaking change)
Make invoke work on objects instead of collections. Use invoke_map for collections. (breaking change)
Make set_ support mixed list/dict defaults within a single object based on whether key or index path substrings used. (breaking change)
Make set_ modify object in place. (breaking change)
Only use merge callback result if result is not None. Previously, result from callback (if provided) was used unconditionally. (breaking change)
Remove functions: (breaking change)
deep_pluck (no alternative) [UPDATE: deep_pluck functionality restored as pluck in v4.0.1]
mapiter (no alternative)
pluck (use map_)
update_path (use update or update_with)
set_path (use set_ or set_with)
Remove aliases: (breaking change)
all_ (use every)
any_ (use some)
append (use push)
average and avg (use mean or mean_by)
callback (use iteratee)
cat (use concat)
collect (use map_)
contains (use includes)
curve (use round_)
deep_get and get_path (use get)
deep_has and has_path (use has)
deep_prop (use property_deep)
deep_set (use set_)
detect and find_where (use find)
each (use for_each)
each_right (use for_each_right)
escape_re (use escape_reg_exp)
explode (use split)
extend (use assign)
first (use head)
foldl (use reduce)
foldr (use reduce_right)
for_own (use for_each)
for_own_right (use for_each_right)
implode (use join)
is_bool (use is_boolean)
is_int (use is_integer)
is_native (use is_builtin)
is_num (use is_number)
is_plain_object (use is_dict)
is_re (use is_reg_exp)
js_match (use reg_exp_js_match)
js_replace (use reg_exp_js_replace)
keys_in (use keys)
moving_average and moving_avg (use moving_mean)
object_ (use zip_object)
pad_left (use pad_start)
pad_right (use pad_end)
pipe (use flow)
pipe_right and compose (use flow_right)
prop (use property_)
prop_of (use property_of)
pow_ (use power)
re_replace (use reg_exp_replace)
rest (use tail)
select (use filter_)
sigma (use std_deviation)
sort_by_all and sort_by_order (use order_by)
trim_left (use trim_start)
trim_right (use trim_right)
trunc (use truncate)
underscore_case (use snake_case)
unique (use uniq)
values_in (use values)
where (use filter_)
Rename functions: (breaking change)
deep_map_values to map_values_deep
deep_property to property_deep
include to includes
index_by to key_by
mod_args to over_args
moving_average to moving_mean
pairs to to_pairs
Remove callback argument from: (breaking change)
assign. Moved to assign_with.
clone and clone_deep. Moved to clone_with and clone_deep_with.
is_match. Moved to is_match_with.
max_ and min_. Moved to max_by and min_by.
omit. Moved to omit_by.
pick. Moved to pick_by.
sorted_index. Moved to sorted_index_by.
sum_. Moved to sum_by.
uniq/unique. Moved to uniq_by.
Renamed callback argument to predicate: (breaking change)
drop_right_while
drop_while
every
filter_
find
find_key
find_last
find_index
find_last_index
find_last_key
partition
reject
remove
some
take_right_while
take_while
Renamed callback argument to iteratee: (breaking change)
count_by
duplicates
for_each
for_each_right
for_in
for_in_right
group_by
key_by
map_
map_keys
map_values
map_values_deep
mapcat
median
reduce_
reduce_right
reductions
reductions_right
sort_by
times
transform
unzip_with
zip_with
zscore
Rename comparison argument in sort to comparator.
Rename index and how_many arguments in splice to start and count.
Remove multivalue argument from invert. Feature moved to invert_by. (breaking change)
Make internal function inspection methods work with Python 3 annotations. Thanks tgriesser_!
Make internal function inspection methods work with Python 3 annotations. Thanks tgriesser_!
Fix bug in get where an iterable default was iterated over instead of being returned when an object path wasn't found. Thanks urbnjamesmi1_!
Fix bug in get where an iterable default was iterated over instead of being returned when an object path wasn't found. Thanks urbnjamesmi1_!
Fix bug in get where casting a string key to integer resulted in an uncaught exception instead of the default value being returned instead. Thanks urb
Fix bug in get where casting a string key to integer resulted in an uncaught exception instead of the default value being returned instead. Thanks urbnjamesmi1_!
Add optional default parameter to min_ and max_ functions that is used when provided iterable is empty.
Add optional default parameter to min_ and max_ functions that is used when provided iterable is empty.
Fix bug in is_match where comparison between an empty source argument returned None instead of True.
Shallow copy each source in assign/extend instead of deep copying.
Shallow copy each source in assign/extend instead of deep copying.
Call copy.deepcopy in merge instead of the more resource intensive clone_deep.
Fix minor issue in deep path string parsing so that list indexing in paths can be specified as foo[0][1].bar instead of foo.[0].[1].bar. Both formats
Fix minor issue in deep path string parsing so that list indexing in paths can be specified as foo[0][1].bar instead of foo.[0].[1].bar. Both formats are now supported.
Fix bug in start_case where capitalized characters after the first character of a word where mistakenly cast to lower case.
Fix bug in start_case where capitalized characters after the first character of a word where mistakenly cast to lower case.
Your coding agent can read these notes before it upgrades. Set up the MCP server →