# Buggy code
def __init__(self, projparams=None, preserve_units=True, **kwargs):
    """
    initialize a Proj class instance.

    See the proj documentation (https://github.com/OSGeo/proj.4/wiki)
    for more information about projection parameters.

    Parameters
    ----------
    projparams: int, str, dict, pyproj.CRS
        A proj.4 or WKT string, proj.4 dict, EPSG integer, or a pyproj.CRS instnace.
    preserve_units: bool
        If false, will ensure +units=m.
    **kwargs:
        proj.4 projection parameters.


    Example usage:

    >>> from pyproj import Proj
    >>> p = Proj(proj='utm',zone=10,ellps='WGS84', preserve_units=False) # use kwargs
    >>> x,y = p(-120.108, 34.36116666)
    >>> 'x=%9.3f y=%11.3f' % (x,y)
    'x=765975.641 y=3805993.134'
    >>> 'lon=%8.3f lat=%5.3f' % p(x,y,inverse=True)
    'lon=-120.108 lat=34.361'
    >>> # do 3 cities at a time in a tuple (Fresno, LA, SF)
    >>> lons = (-119.72,-118.40,-122.38)
    >>> lats = (36.77, 33.93, 37.62 )
    >>> x,y = p(lons, lats)
    >>> 'x: %9.3f %9.3f %9.3f' % x
    'x: 792763.863 925321.537 554714.301'
    >>> 'y: %9.3f %9.3f %9.3f' % y
    'y: 4074377.617 3763936.941 4163835.303'
    >>> lons, lats = p(x, y, inverse=True) # inverse transform
    >>> 'lons: %8.3f %8.3f %8.3f' % lons
    'lons: -119.720 -118.400 -122.380'
    >>> 'lats: %8.3f %8.3f %8.3f' % lats
    'lats:   36.770   33.930   37.620'
    >>> p2 = Proj('+proj=utm +zone=10 +ellps=WGS84', preserve_units=False) # use proj4 string
    >>> x,y = p2(-120.108, 34.36116666)
    >>> 'x=%9.3f y=%11.3f' % (x,y)
    'x=765975.641 y=3805993.134'
    >>> p = Proj(init="epsg:32667", preserve_units=False)
    >>> 'x=%12.3f y=%12.3f (meters)' % p(-114.057222, 51.045)
    'x=-1783506.250 y= 6193827.033 (meters)'
    >>> p = Proj("+init=epsg:32667")
    >>> 'x=%12.3f y=%12.3f (feet)' % p(-114.057222, 51.045)
    'x=-5851386.754 y=20320914.191 (feet)'
    >>> # test data with radian inputs
    >>> p1 = Proj(init="epsg:4214")
    >>> x1, y1 = p1(116.366, 39.867)
    >>> '{:.3f} {:.3f}'.format(x1, y1)
    '2.031 0.696'
    >>> x2, y2 = p1(x1, y1, inverse=True)
    >>> '{:.3f} {:.3f}'.format(x2, y2)
    '116.366 39.867'
    """
    self.crs = CRS.from_user_input(projparams if projparams is not None else kwargs)
    # make sure units are meters if preserve_units is False.
    if not preserve_units and "foot" in self.crs.axis_info[0].unit_name:
        projstring = self.crs.to_proj4(4)
        projstring = re.sub(r"\s\+units=[\w-]+", "", projstring)
        projstring += " +units=m"
        self.crs = CRS(projstring)
    super(Proj, self).__init__(
        cstrencode(self.crs.to_proj4().replace("+type=crs", "").strip())
    )


# Traceback (AttributeError)
from pyproj import Proj
Proj({'a': 6371229.0, 'b': 6371229.0, 'lon_0': -10.0, 'o_lat_p': 30.0, 'o_lon_p': 0.0, 'o_proj': 'longlat', 'proj'
: 'ob_tran'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../lib/python3.7/site-packages/pyproj/proj.py", line 303, in __init__
cstrencode(self.crs.to_proj4().replace("+type=crs", "").strip())
AttributeError: 'NoneType' object has no attribute 'replace'

# Fixed code
def __init__(self, projparams=None, preserve_units=True, **kwargs):
    """
    initialize a Proj class instance.

    See the proj documentation (https://github.com/OSGeo/proj.4/wiki)
    for more information about projection parameters.

    Parameters
    ----------
    projparams: int, str, dict, pyproj.CRS
        A proj.4 or WKT string, proj.4 dict, EPSG integer, or a pyproj.CRS instnace.
    preserve_units: bool
        If false, will ensure +units=m.
    **kwargs:
        proj.4 projection parameters.


    Example usage:

    >>> from pyproj import Proj
    >>> p = Proj(proj='utm',zone=10,ellps='WGS84', preserve_units=False) # use kwargs
    >>> x,y = p(-120.108, 34.36116666)
    >>> 'x=%9.3f y=%11.3f' % (x,y)
    'x=765975.641 y=3805993.134'
    >>> 'lon=%8.3f lat=%5.3f' % p(x,y,inverse=True)
    'lon=-120.108 lat=34.361'
    >>> # do 3 cities at a time in a tuple (Fresno, LA, SF)
    >>> lons = (-119.72,-118.40,-122.38)
    >>> lats = (36.77, 33.93, 37.62 )
    >>> x,y = p(lons, lats)
    >>> 'x: %9.3f %9.3f %9.3f' % x
    'x: 792763.863 925321.537 554714.301'
    >>> 'y: %9.3f %9.3f %9.3f' % y
    'y: 4074377.617 3763936.941 4163835.303'
    >>> lons, lats = p(x, y, inverse=True) # inverse transform
    >>> 'lons: %8.3f %8.3f %8.3f' % lons
    'lons: -119.720 -118.400 -122.380'
    >>> 'lats: %8.3f %8.3f %8.3f' % lats
    'lats:   36.770   33.930   37.620'
    >>> p2 = Proj('+proj=utm +zone=10 +ellps=WGS84', preserve_units=False) # use proj4 string
    >>> x,y = p2(-120.108, 34.36116666)
    >>> 'x=%9.3f y=%11.3f' % (x,y)
    'x=765975.641 y=3805993.134'
    >>> p = Proj(init="epsg:32667", preserve_units=False)
    >>> 'x=%12.3f y=%12.3f (meters)' % p(-114.057222, 51.045)
    'x=-1783506.250 y= 6193827.033 (meters)'
    >>> p = Proj("+init=epsg:32667")
    >>> 'x=%12.3f y=%12.3f (feet)' % p(-114.057222, 51.045)
    'x=-5851386.754 y=20320914.191 (feet)'
    >>> # test data with radian inputs
    >>> p1 = Proj(init="epsg:4214")
    >>> x1, y1 = p1(116.366, 39.867)
    >>> '{:.3f} {:.3f}'.format(x1, y1)
    '2.031 0.696'
    >>> x2, y2 = p1(x1, y1, inverse=True)
    >>> '{:.3f} {:.3f}'.format(x2, y2)
    '116.366 39.867'
    """
    self.crs = CRS.from_user_input(projparams if projparams is not None else kwargs)
    # make sure units are meters if preserve_units is False.
    if not preserve_units and "foot" in self.crs.axis_info[0].unit_name:
        projstring = self.crs.to_proj4(4)
        projstring = re.sub(r"\s\+units=[\w-]+", "", projstring)
        projstring += " +units=m"
        self.crs = CRS(projstring)
    super(Proj, self).__init__(
        cstrencode(
            (self.crs.to_proj4() or self.crs.srs).replace("+type=crs", "").strip()
        )
    )