@@ -178,6 +178,58 @@ func importOne(f *Frame, name string) (*Object, *BaseException) {
178178 return o , nil
179179}
180180
181+ // LoadMembers scans over all the members in module
182+ // and populates globals with them, taking __all__ into
183+ // account.
184+ func LoadMembers (f * Frame , module * Object ) * BaseException {
185+ allAttr , raised := GetAttr (f , module , NewStr ("__all__" ), nil )
186+ if raised != nil && ! raised .isInstance (AttributeErrorType ) {
187+ return raised
188+ }
189+ f .RestoreExc (nil , nil )
190+
191+ if raised == nil {
192+ raised = loadMembersFromIterable (f , module , allAttr , nil )
193+ if raised != nil {
194+ return raised
195+ }
196+ return nil
197+ }
198+
199+ // Fall back on __dict__
200+ dictAttr := module .dict .ToObject ()
201+ raised = loadMembersFromIterable (f , module , dictAttr , func (key * Object ) bool {
202+ return strings .HasPrefix (toStrUnsafe (key ).value , "_" )
203+ })
204+ if raised != nil {
205+ return raised
206+ }
207+ return nil
208+ }
209+
210+ func loadMembersFromIterable (f * Frame , module , iterable * Object , filterF func (* Object ) bool ) * BaseException {
211+ globals := f .Globals ()
212+ raised := seqForEach (f , iterable , func (memberName * Object ) * BaseException {
213+ if ! memberName .isInstance (StrType ) {
214+ errorMessage := fmt .Sprintf ("attribute name must be string, not '%v'" , memberName .typ .Name ())
215+ return f .RaiseType (AttributeErrorType , errorMessage )
216+ }
217+ member , raised := GetAttr (f , module , toStrUnsafe (memberName ), nil )
218+ if raised != nil {
219+ return raised
220+ }
221+ if filterF != nil && filterF (memberName ) {
222+ return nil
223+ }
224+ raised = globals .SetItem (f , memberName , member )
225+ if raised != nil {
226+ return raised
227+ }
228+ return nil
229+ })
230+ return raised
231+ }
232+
181233// newModule creates a new Module object with the given fully qualified name
182234// (e.g a.b.c) and its corresponding Python filename and package.
183235func newModule (name , filename string ) * Module {
0 commit comments