@@ -108,7 +108,9 @@ func ImportModuleLevelObject(ctx Context, name string, globals, locals StringDic
108108 }
109109
110110 if fromFile , ok := globals ["__file__" ]; ok {
111- opts .CurDir = filepath .Dir (string (fromFile .(String )))
111+ if fromFileStr , ok := fromFile .(String ); ok {
112+ opts .CurDir = filepath .Dir (string (fromFileStr ))
113+ }
112114 }
113115
114116 module , err := RunFile (ctx , srcPathname , opts , name )
@@ -344,14 +346,42 @@ func BuiltinImport(ctx Context, self Object, args Tuple, kwargs StringDict, curr
344346 var globals Object = currentGlobal
345347 var locals Object = NewStringDict ()
346348 var fromlist Object = Tuple {}
349+ var fromlistTuple Tuple
347350 var level Object = Int (0 )
348351
349352 err := ParseTupleAndKeywords (args , kwargs , "U|OOOi:__import__" , kwlist , & name , & globals , & locals , & fromlist , & level )
350353 if err != nil {
351354 return nil , err
352355 }
356+ levelObj , ok := level .(Int )
357+ if ! ok {
358+ return nil , ExceptionNewf (TypeError , "__import__() argument 5 must be int, not %s" , level .Type ().Name )
359+ }
360+ levelInt := int (levelObj )
361+
362+ var globalsDict StringDict
363+ if globalsTyped , ok := globals .(StringDict ); ok {
364+ globalsDict = globalsTyped
365+ } else {
366+ if levelInt > 0 {
367+ return nil , ExceptionNewf (TypeError , "globals must be a dict" )
368+ }
369+ globalsDict = StringDict {}
370+ }
371+
372+ localsDict , ok := locals .(StringDict )
373+ if ! ok {
374+ localsDict = StringDict {}
375+ }
376+
353377 if fromlist == None {
354- fromlist = Tuple {}
378+ fromlistTuple = Tuple {}
379+ } else {
380+ fromlistTuple , err = SequenceTuple (fromlist )
381+ if err != nil {
382+ return nil , err
383+ }
355384 }
356- return ImportModuleLevelObject (ctx , string (name .(String )), globals .(StringDict ), locals .(StringDict ), fromlist .(Tuple ), int (level .(Int )))
385+
386+ return ImportModuleLevelObject (ctx , string (name .(String )), globalsDict , localsDict , fromlistTuple , levelInt )
357387}
0 commit comments