Show More
@@ -72,27 +72,18 b" ip.set_hook('complete_command', apt_completers, re_key = '.*yum')" | |||||
72 | pkg_cache = None |
|
72 | pkg_cache = None | |
73 |
|
73 | |||
74 | def module_completer(self,event): |
|
74 | def module_completer(self,event): | |
75 |
""" Give completions after user has typed 'import' |
|
75 | """ Give completions after user has typed 'import'. | |
76 |
|
|
76 | ||
77 | # only a local version for py 2.4, pkgutil has no walk_packages() there |
|
77 | Note that only possible completions in the local directory are returned.""" | |
78 | if sys.version_info < (2,5): |
|
78 | ||
79 | for el in [f[:-3] for f in glob.glob("*.py")]: |
|
79 | # This works in all versions of python. While 2.5 has | |
80 | yield el |
|
80 | # pkgutil.walk_packages(), that particular routine is fairly dangerous, | |
81 | return |
|
81 | # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full | |
82 |
|
82 | # of possibly problematic side effects. At some point we may implement | ||
83 | global pkg_cache |
|
83 | # something that searches sys.path in a saner/safer way, but for now we'll | |
84 | import pkgutil,imp,time |
|
84 | # restrict ourselves to local completions only. | |
85 | #current = |
|
85 | for el in [f[:-3] for f in glob.glob("*.py")]: | |
86 | if pkg_cache is None: |
|
86 | yield el | |
87 | print "\n\n[Standby while scanning modules, this can take a while]\n\n" |
|
|||
88 | pkg_cache = list(pkgutil.walk_packages()) |
|
|||
89 |
|
||||
90 | already = set() |
|
|||
91 | for ld, name, ispkg in pkg_cache: |
|
|||
92 | if name.count('.') < event.symbol.count('.') + 1: |
|
|||
93 | if name not in already: |
|
|||
94 | already.add(name) |
|
|||
95 | yield name + (ispkg and '.' or '') |
|
|||
96 | return |
|
87 | return | |
97 |
|
88 | |||
98 | ip.set_hook('complete_command', module_completer, str_key = 'import') |
|
89 | ip.set_hook('complete_command', module_completer, str_key = 'import') |
@@ -1,7 +1,7 b'' | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """Magic functions for InteractiveShell. |
|
2 | """Magic functions for InteractiveShell. | |
3 |
|
3 | |||
4 |
$Id: Magic.py 2 |
|
4 | $Id: Magic.py 2200 2007-04-03 05:24:30Z fperez $""" | |
5 |
|
5 | |||
6 | #***************************************************************************** |
|
6 | #***************************************************************************** | |
7 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and |
|
7 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and | |
@@ -936,12 +936,6 b' Currently the magic system has the following functions:\\n"""' | |||||
936 | return |
|
936 | return | |
937 |
|
937 | |||
938 | # if we have variables, move on... |
|
938 | # if we have variables, move on... | |
939 |
|
||||
940 | # stupid flushing problem: when prompts have no separators, stdout is |
|
|||
941 | # getting lost. I'm starting to think this is a python bug. I'm having |
|
|||
942 | # to force a flush with a print because even a sys.stdout.flush |
|
|||
943 | # doesn't seem to do anything! |
|
|||
944 |
|
||||
945 | count = 0 |
|
939 | count = 0 | |
946 | for i in varlist: |
|
940 | for i in varlist: | |
947 | print i+'\t', |
|
941 | print i+'\t', | |
@@ -949,9 +943,7 b' Currently the magic system has the following functions:\\n"""' | |||||
949 | if count > 8: |
|
943 | if count > 8: | |
950 | count = 0 |
|
944 | count = 0 | |
951 |
|
945 | |||
952 | sys.stdout.flush() # FIXME. Why the hell isn't this flushing??? |
|
946 | ||
953 |
|
||||
954 | print # well, this does force a flush at the expense of an extra \n |
|
|||
955 |
|
947 | |||
956 | def magic_whos(self, parameter_s=''): |
|
948 | def magic_whos(self, parameter_s=''): | |
957 | """Like %who, but gives some extra information about each variable. |
|
949 | """Like %who, but gives some extra information about each variable. | |
@@ -962,8 +954,8 b' Currently the magic system has the following functions:\\n"""' | |||||
962 |
|
954 | |||
963 | - For {},[],(): their length. |
|
955 | - For {},[],(): their length. | |
964 |
|
956 | |||
965 |
- For Numeric arrays, a summary with shape, number of |
|
957 | - For numpy and Numeric arrays, a summary with shape, number of | |
966 | typecode and size in memory. |
|
958 | elements, typecode and size in memory. | |
967 |
|
959 | |||
968 | - Everything else: a string representation, snipping their middle if |
|
960 | - Everything else: a string representation, snipping their middle if | |
969 | too long.""" |
|
961 | too long.""" | |
@@ -978,16 +970,21 b' Currently the magic system has the following functions:\\n"""' | |||||
978 | # for these types, show len() instead of data: |
|
970 | # for these types, show len() instead of data: | |
979 | seq_types = [types.DictType,types.ListType,types.TupleType] |
|
971 | seq_types = [types.DictType,types.ListType,types.TupleType] | |
980 |
|
972 | |||
981 | # for Numeric arrays, display summary info |
|
973 | # for numpy/Numeric arrays, display summary info | |
|
974 | try: | |||
|
975 | import numpy | |||
|
976 | except ImportError: | |||
|
977 | ndarray_type = None | |||
|
978 | else: | |||
|
979 | ndarray_type = numpy.ndarray.__name__ | |||
982 | try: |
|
980 | try: | |
983 | import Numeric |
|
981 | import Numeric | |
984 | except ImportError: |
|
982 | except ImportError: | |
985 | array_type = None |
|
983 | array_type = None | |
986 | else: |
|
984 | else: | |
987 | array_type = Numeric.ArrayType.__name__ |
|
985 | array_type = Numeric.ArrayType.__name__ | |
988 |
|
986 | |||
989 | # Find all variable names and types so we can figure out column sizes |
|
987 | # Find all variable names and types so we can figure out column sizes | |
990 |
|
||||
991 | def get_vars(i): |
|
988 | def get_vars(i): | |
992 | return self.shell.user_ns[i] |
|
989 | return self.shell.user_ns[i] | |
993 |
|
990 | |||
@@ -1004,7 +1001,8 b' Currently the magic system has the following functions:\\n"""' | |||||
1004 | tt = type_name(vv) |
|
1001 | tt = type_name(vv) | |
1005 |
|
1002 | |||
1006 | if tt=='instance': |
|
1003 | if tt=='instance': | |
1007 |
typelist.append( abbrevs.get(str(vv.__class__), |
|
1004 | typelist.append( abbrevs.get(str(vv.__class__), | |
|
1005 | str(vv.__class__))) | |||
1008 | else: |
|
1006 | else: | |
1009 | typelist.append(tt) |
|
1007 | typelist.append(tt) | |
1010 |
|
1008 | |||
@@ -1030,14 +1028,23 b' Currently the magic system has the following functions:\\n"""' | |||||
1030 | print itpl(vformat), |
|
1028 | print itpl(vformat), | |
1031 | if vtype in seq_types: |
|
1029 | if vtype in seq_types: | |
1032 | print len(var) |
|
1030 | print len(var) | |
1033 |
elif vtype |
|
1031 | elif vtype in [array_type,ndarray_type]: | |
1034 | vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1] |
|
1032 | vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1] | |
1035 | vsize = Numeric.size(var) |
|
1033 | if vtype==ndarray_type: | |
1036 | vbytes = vsize*var.itemsize() |
|
1034 | # numpy | |
|
1035 | vsize = var.size | |||
|
1036 | vbytes = vsize*var.itemsize | |||
|
1037 | vdtype = var.dtype | |||
|
1038 | else: | |||
|
1039 | # Numeric | |||
|
1040 | vsize = Numeric.size(var) | |||
|
1041 | vbytes = vsize*var.itemsize() | |||
|
1042 | vdtype = var.typecode() | |||
|
1043 | ||||
1037 | if vbytes < 100000: |
|
1044 | if vbytes < 100000: | |
1038 |
print aformat % (vshape,vsize,v |
|
1045 | print aformat % (vshape,vsize,vdtype,vbytes) | |
1039 | else: |
|
1046 | else: | |
1040 |
print aformat % (vshape,vsize,v |
|
1047 | print aformat % (vshape,vsize,vdtype,vbytes), | |
1041 | if vbytes < Mb: |
|
1048 | if vbytes < Mb: | |
1042 | print '(%s kb)' % (vbytes/kb,) |
|
1049 | print '(%s kb)' % (vbytes/kb,) | |
1043 | else: |
|
1050 | else: |
@@ -1,5 +1,12 b'' | |||||
1 | 2007-04-02 Fernando Perez <Fernando.Perez@colorado.edu> |
|
1 | 2007-04-02 Fernando Perez <Fernando.Perez@colorado.edu> | |
2 |
|
2 | |||
|
3 | * IPython/Extensions/ipy_stock_completers.py (module_completer): | |||
|
4 | remove usage of the dangerous pkgutil.walk_packages(). See | |||
|
5 | details in comments left in the code. | |||
|
6 | ||||
|
7 | * IPython/Magic.py (magic_whos): add support for numpy arrays | |||
|
8 | similar to what we had for Numeric. | |||
|
9 | ||||
3 | * IPython/completer.py (IPCompleter.complete): extend the |
|
10 | * IPython/completer.py (IPCompleter.complete): extend the | |
4 | complete() call API to support completions by other mechanisms |
|
11 | complete() call API to support completions by other mechanisms | |
5 | than readline. Closes #109. |
|
12 | than readline. Closes #109. |
General Comments 0
You need to be logged in to leave comments.
Login now