Skip to content

Instantly share code, notes, and snippets.

View mahmoud's full-sized avatar
Back on the grid!

Mahmoud Hashemi mahmoud

Back on the grid!
View GitHub Profile
@mahmoud
mahmoud / remerge.py
Last active November 29, 2023 09:08
Recursively merging dictionaries with boltons.iterutils.remap. Useful for @hynek's configs. https://twitter.com/hynek/status/696720593002041345
"""
This is an extension of the technique first detailed here:
http://sedimental.org/remap.html#add_common_keys
In short, it calls remap on each container, back to front, using the accumulating
previous values as the default for the current iteration.
"""
from boltons.iterutils import is_scalar, remap
garbagey = {'attributes':
{'vars':
{'network':
{'addresses': []}},
'characteristics':
{'chars': 'abc',
'misc_obj': {},
'others': [1, 2]}
@mahmoud
mahmoud / glom_post_data_trace.py
Created January 13, 2023 21:14
Contrasting Python default stack trace vs Glom data trace
# python 3.10 with glom 23
>>> import glom
>>> target = {'planets': [{'name': 'earth', 'moons': 1}]}
>>> spec = ('planets', ['rings']) # a spec we expect to fail
>>> glom.glom(target, spec)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/mahmoud/projects/glom/glom/core.py", line 2297, in glom
raise err
glom.core.PathAccessError: error raised while processing, details below.
@mahmoud
mahmoud / scheme_port_map.json
Last active December 12, 2022 17:42
A big mapping url schemes to their protocols' default ports. See comments below for notes. Painstakingly assembled by crossreferencing https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml and https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
{
"acap": 674,
"afp": 548,
"dict": 2628,
"dns": 53,
"file": null,
"ftp": 21,
"git": 9418,
"gopher": 70,
"http": 80,
@mahmoud
mahmoud / hashtag.py
Last active May 14, 2021 19:13
hashtag regex in python
import re
# the first group is noncapturing and just ensures we're at the beginning of
# the string or have whitespace before the hashtag (don't want to capture anchors)
# without the fullwidth hashmark, hashtags in asian languages would be tough
hashtag_re = re.compile("(?:^|\s)[##]{1}(\w+)", re.UNICODE)
@mahmoud
mahmoud / conftest.py
Last active March 10, 2021 08:51
Excerpted tidbits from our Django app's conftest during the Django 1 to 2 and Python 2 to 3 migration ("TR" stands for "Tech Refresh", circa mid 2020), with parts related to wrapping the test session in a DB transaction, and other parts related to bulk-skipping functionality. Tested on py2.7/3.6, Django 1.11/2.0.x, pytest 4.6.11.
# -*- coding: utf-8 -*-
"""
Common test fixtures for pytest
"""
from __future__ import print_function, unicode_literals
import os
from itertools import groupby
import pytest
@mahmoud
mahmoud / design.py
Last active July 28, 2020 08:05
improved branched glom error ascii design
before = \
'''
Traceback (most recent call last):
File "tmp.py", line 9, in _make_stack
glom(target, spec)
File "/home/mahmoud/projects/glom/glom/core.py", line 2024, in glom
raise err
glom.core.PathAccessError: error raised while processing, details below.
Target-spec trace (most recent last):
@mahmoud
mahmoud / py3_except.py
Created June 26, 2020 07:08
python3 exception var deleting
$ python3
Python 3.7.7 (default, Mar 10 2020, 17:25:08)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> e = 'hi'
>>> try:
... 1/0
... except Exception as e:
... pass
...
@mahmoud
mahmoud / py3_partials.py
Created March 17, 2020 06:56
TIL py3 partials don't mind multiple values for arguments
>>> def f(a, b):
... return a, b
...
# py27
>>> partial(f, b=1)(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'b'
@mahmoud
mahmoud / basic_argparse_framework.py
Last active May 1, 2019 00:56
(based on years of argparse experience, also serves to demonstrate why argparse is not so good)
def create_parser():
root_parser = ArgumentParser(description='article fetch operations')
root_parser.add_argument('--list_home', help='list lookup directory')
add_subparsers(root_parser.add_subparsers())
return root_parser
def add_subparsers(subparsers):
parser_list = subparsers.add_parser('list')
parser_list.add_argument('target_list', nargs='?',